尝试编写的rabbitmq+spring 框架
spring有自己的一套框架与消息队列结合使用http://projects.spring.io/spring-amqp/,这个接下来会好好的研究一下。
在领导的帮助下,终于勉强写完了这个消息队列的框架,觉得真的还不能投入使用,但是在这个编写的过程中,真的学到了很多东西,也发现了自己的不足之处。
以下是对该框架的总结:
1.首先定义了以下几个接口:
Ihandler(处理事件的接口)
|__IHandlerT<T>(带事件类型的处理接口)
|__IResultHandler<T, TResult>(带返回值,事件类型的处理接口)
IListener(操作监听事件并处理的接口)
IMessageBus(发送事件的接口)
IMessageSerializer(序列化和反序列化的接口)
IHandlerThreadStore(保存具体监听的接口,便于操作监听)
IRabbitServerConfig(存放一些rabbitmq连接配置的接口)
2.将一些可以的实现的方法,定义一个抽象类先实现了,将最后不确定的有关业务的方法或者不确定具体实现的方法,写为抽象方法,待子类继承后重写。
以下是一些实现类和一些抽象类:
JsonMessageSerializer(实现序列化和反序列化)
MessageBusBase(实现send方法,call方法)
|__RabbitMqBus(实现使用rabbitmq时SendToQueue方法)
RabbitMqListener(实现具体的监听并处理,一些重试机制等)
HandlerBase (不带结果的处理抽象类)
ResultHandlerBase(带结果的处理抽象类)
TestConfig(对rabbitmql连接的自定义配置)
3.利用spring将一些实现注入进来,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- <bean id="userDao" class="com.uninf.dao.UserDaoImpl"> <property name="sessionFactory"
ref="sessionFactory"></property> </bean> -->
<!-- <bean id="userManagerBase" class="com.uninf.service.UserManagerServiceImpl">
<property name="userDao" ref="userDao"></property> </bean> --> <!-- 配置 -->
<bean id="iRabbitServerConfig" class="test.TestConfig">
</bean> <!--序列化 -->
<bean id="iMessageSerializer" class="RabbitMq.JsonMessageSerializer">
</bean> <!-- 线程存储 -->
<bean id="testHanderThreadStore" class="test.TestHanderThreadStore">
</bean> <!-- 用于发送的类 -->
<bean id="rabbitMqBus" class="RabbitMq.RabbitMqBus" abstract="true">
<property name="iRabbitServerConfig" ref="iRabbitServerConfig"></property>
<property name="iMessageSerializer" ref="iMessageSerializer"></property>
</bean>
<bean id="testbus" class="com.uninf.rabbitmq.TestBus" parent="rabbitMqBus"></bean> <!-- 用于监听的类 -->
<bean id="rabbitMqListener" class="RabbitMq.RabbitMqListener"
abstract="true">
<property name="config" ref="iRabbitServerConfig"></property>
<property name="db" ref="testHanderThreadStore"></property>
</bean>
<bean id="testListner" class="test.TestListner" parent="rabbitMqListener"></bean> <!--无返回值 的基类 -->
<bean id="handlerBase" class="Uninf.Bus.HandlerBase" abstract="true">
<property name="iMessageSerializer" ref="iMessageSerializer"></property>
</bean>
<!-- 有返回值的基类 -->
<bean id="resultHandlerBase" class="Uninf.Bus.ResultHandlerBase"
abstract="true">
<property name="iMessageSerializer" ref="iMessageSerializer"></property>
</bean> <!--使用时需要配置的handler -->
<bean id="userHandler" class="com.uninf.handler.UserHandler" parent="handlerBase"></bean>
<bean id="emailHandler" class="com.uninf.handler.EmailHandler" parent="handlerBase"></bean>
<bean id="synchroUserHandler" class="com.uninf.handler.SynchroUserHandler" parent="resultHandlerBase"></bean> <!-- 处理事务 -->
<bean name="userManagerService" parent="transactionProxy">
<property name="target" ref="userManagerServiceImpl"></property>
</bean>
</beans>
那这个框架写完之后,开发人员只需要在配置文件中写好自己的handler就ok啦,后期再看看能不能用注解代替。如果能的话就是零配置了,呵呵哒~
如果要扔到消息队列中,那就把是否为异步的方法改为true就ok啦,如果要同步执行,默认false直接在内存中就执行啦。贴一个简单的handler事例,继承HandlerBase即可
public class EmailHandler extends HandlerBase<User>{ @Override
public void Handle(User msg) throws Exception {
// TODO Auto-generated method stub
System.out.println("save the message~~");
} @Override
public int Sort() {
// TODO Auto-generated method stub
return 0;
} @Override
public boolean Async() {
// TODO Auto-generated method stub
return true;
} }
有返回值的那必定是同步的,是调用call方法。handler代码如下:
public class SynchroUserHandler extends ResultHandlerBase<User, String>{ @Autowired
private TestBus testbus; @Override
public String Handle(User msg) {
// TODO Auto-generated method stub
testbus.Send(msg, User.class);;
return "I can Synchr";
} @Override
public Type getCallType() {
// TODO Auto-generated method stub
return User.class;
} }
看以下我们所说的service就一目了然啦:
@Service
public class UserManagerServiceImpl implements UserManagerService { @Autowired
private TestBus testbus;
@Autowired
private UserDao userDao;
public void sendEmail(){
User user = new User();
user.setAge("11");
user.setUserName("qiang");
String qiang = testbus.Call(user, User.class, String.class);
System.out.println("返回值为:"+qiang);
} }
逻辑基本是这样的:用户点击-->调用service-->调用call方法-->做各种事情,然后send将异步的扔到消息队列中-->交由异步的handler执行。
当然还有一些排序,还有对事件的持久化等还木有完善,但是感觉良好,第一次写框架,感觉自己好差劲,需要加油了~~
尝试编写的rabbitmq+spring 框架的更多相关文章
- 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议
前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...
- 搭建简单的Spring框架
1.Spring框架相关jar包下载地址http://repo.springsource.org/libs-release-local/org/springframework/spring,复制,进入 ...
- (转)在编写Spring框架的配置文件时,标签无提示符的解决办法
http://blog.csdn.net/yerenyuan_pku/article/details/52831618 问题描述 初学者在学习Spring框架的过程中,大概会碰到这样一个问题:在编写S ...
- Spring MVC -- Spring框架入门(IoC和DI)
Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...
- Spring 框架
一. Spring入门 Spring模块都打包成JAR文件,其命名格式如下: spring-maluleName-x.y.z.RELEASE.jar 其中module name是模块的名字,而x.y. ...
- spring框架篇(一)-------spring简介与配置文件使用控制反转事例
spring简介 Spring 是一个开源框架,中文意思就是春天,也许是作者想让自己的这个框架给Java开发人员带来春天吧.其官方网站是 https://spring.io/ ,可以在官方网站下载到完 ...
- Spring Boot 必须先说说 Spring 框架!
现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下. Spring Boot ...
- Spring系列(2):Spring框架
一.Spring定义 Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用. Spring是于2003 年兴起的一个轻量级 ...
- Spring框架 课程笔记
Spring框架 课程笔记 第1章 Spring概述 1.1 Spring概述 1) Spring是一个开源框架 2) Spring为简化企业级开发而生,使用Spring ...
随机推荐
- .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
.NET/C# 程序从 Main 函数开始执行,基本上各种书籍资料都是这么写的.不过,我们可以写多个 Main 函数,然后在项目文件中设置应该选择哪一个 Main 函数. 你可能会觉得这样没有什么用, ...
- Java进行数据库导出导入 亲测可用
/** * @param hostIP ip地址,可以是本机也可以是远程 * @param userName 数据库的用户名 * @param password 数据库的密码 * @param sav ...
- table 如何给tr border颜色
border-collapse属性值 说明 separate 默认值,边框分开,不合并 collapse 边框合并,如果相邻,则共用一个边框 table,th,td{border:1px solid ...
- NTP时间服务器的配置
1.NTP简介NTP(Network Time Protocol,网络时间协议)是用来使网络中的计算机,时间同步的一种协议.NTP服务器利用NTP协议来提供时间同步服务. 2 .环境准备主机名 ...
- Centos 6 安装 配置 oracle11g R2
1.安装centos6.3_64位: 下载地址:http://mirror.bit.edu.cn/centos/6.3/isos/x86_64/ CentOS-6.3-x86_64-bin-DVD1. ...
- 转--NLTK的内置函数
NLTK的内置函数 1. 词语索引 (1) concordance函数 给出一个指定单词每一次出现,连同上下文一起显示. >>>text1.concordance('monst ...
- SQL中減少日志文件大小
SQL中減少日志文件大小 编写人:CC阿爸 2014-6-14 在日常SQL数据库的操作中,常常会出现SQL日志文件超大,大小都超过正常MDF数据库文件,作为一般用户来讲,LDF太大,只会影响服务 ...
- bzoj1067 降雨量
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003, ...
- 阿里云VPS(win系统)装ROS教程
以下方法是VPS下的WIN系统下安装ROS的方法,LINUX暂时没有 VPS系统装2003或2008 ,建议2008 启动快,安全,但以下内容是在2003上测试的, 2003系统,2003设置开机自动 ...
- Controlling DNS prefetching
Controlling DNS prefetching IN THIS ARTICLE Background Configuring prefetching in the browser Contro ...