尝试编写的rabbitmq+spring 框架
2015-11-17 13:58
453 查看
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将一些实现注入进来,配置如下:
那这个框架写完之后,开发人员只需要在配置文件中写好自己的handler就ok啦,后期再看看能不能用注解代替。如果能的话就是零配置了,呵呵哒~
如果要扔到消息队列中,那就把是否为异步的方法改为true就ok啦,如果要同步执行,默认false直接在内存中就执行啦。贴一个简单的handler事例,继承HandlerBase即可
有返回值的那必定是同步的,是调用call方法。handler代码如下:
看以下我们所说的service就一目了然啦:
逻辑基本是这样的:用户点击-->调用service-->调用call方法-->做各种事情,然后send将异步的扔到消息队列中-->交由异步的handler执行。
当然还有一些排序,还有对事件的持久化等还木有完善,但是感觉良好,第一次写框架,感觉自己好差劲,需要加油了~~
在领导的帮助下,终于勉强写完了这个消息队列的框架,觉得真的还不能投入使用,但是在这个编写的过程中,真的学到了很多东西,也发现了自己的不足之处。
以下是对该框架的总结:
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执行。
当然还有一些排序,还有对事件的持久化等还木有完善,但是感觉良好,第一次写框架,感觉自己好差劲,需要加油了~~
相关文章推荐
- Java发送邮件(带附件)
- myeclipse 编辑java中的变量时,高亮显示
- spring中bean的创建
- springMvc 前台ajax传入时间请求报400错误
- spring-test结合junit4
- JAVA字符串格式化-String.format()的使用
- Java操作hbase CURD
- Java泛型中的通配符
- 利用反射机制创建新类的两种方式及比较
- spring prototype怎么注入到singleton 里面
- java中ThreadLocal类的使用
- springboot 支持 jsp 的写法(分别使用 maven 和 gradle 作为构建工具)
- 总结一:java可视化编程之Frame容器
- java PO、BO
- 使用JavaMail发送邮件
- Java代码为hbase删除一张表
- Java内功提升之标识符
- spring MVC jpa jpaRepository 数据层访问 方式汇总
- 记录spring使用JDK动态代理,发生的2次代理问题
- Eclipse安装Hadoop插件配置Hadoop开发环境