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 框架的更多相关文章

  1. 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议

    前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...

  2. 搭建简单的Spring框架

    1.Spring框架相关jar包下载地址http://repo.springsource.org/libs-release-local/org/springframework/spring,复制,进入 ...

  3. (转)在编写Spring框架的配置文件时,标签无提示符的解决办法

    http://blog.csdn.net/yerenyuan_pku/article/details/52831618 问题描述 初学者在学习Spring框架的过程中,大概会碰到这样一个问题:在编写S ...

  4. Spring MVC -- Spring框架入门(IoC和DI)

    Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...

  5. Spring 框架

    一. Spring入门 Spring模块都打包成JAR文件,其命名格式如下: spring-maluleName-x.y.z.RELEASE.jar 其中module name是模块的名字,而x.y. ...

  6. spring框架篇(一)-------spring简介与配置文件使用控制反转事例

    spring简介 Spring 是一个开源框架,中文意思就是春天,也许是作者想让自己的这个框架给Java开发人员带来春天吧.其官方网站是 https://spring.io/ ,可以在官方网站下载到完 ...

  7. Spring Boot 必须先说说 Spring 框架!

    现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下. Spring Boot ...

  8. Spring系列(2):Spring框架

    一.Spring定义 Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用. Spring是于2003 年兴起的一个轻量级 ...

  9. Spring框架 课程笔记

    Spring框架 课程笔记 第1章  Spring概述 1.1 Spring概述 1)        Spring是一个开源框架 2)        Spring为简化企业级开发而生,使用Spring ...

随机推荐

  1. [LOJ2541]「PKUWC2018」猎人杀

    loj description 有\(n\)个猎人,每个猎人有一个仇恨度\(w_i\),每个猎人死后会开一枪打死一个还活着的猎人,打中每个猎人的概率与他的仇恨度成正比. 现在你开了第一枪,打死每个猎人 ...

  2. Maven与eclipse整合

    版权声明: https://blog.csdn.net/zdp072/article/details/37355993 一. 创建Java项目 第1步:首先导入前面命令行建立的两个maven项目Hel ...

  3. There is no Action mapped for namespace / and action name login. - [unknown location]

    (自己在浏览器中,直接进入项目的根目录,即 http://localhost:8080/ssh/  时便报错,web.xml文件已经配置了 欢迎页面 <welcome-file-list> ...

  4. Windows应用程序的VC链接器设置

    Windows应用程序的VC链接器设置 /*转载请注明出自 听风独奏 www.GbcDbj.com */ Windows应用程序分为GUI(Graphical User Interface)和CUI( ...

  5. 关于layoutparam 请铭记。。。。

    //rl_pager 是RelativeLayout findViewById(R.id.rl_pager).setLayoutParams(new RelativeLayout.LayoutPara ...

  6. bzoj4542 大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  7. Bootstrap-CL:页面标题

    ylbtech-Bootstrap-CL:页面标题 1.返回顶部 1. Bootstrap 页面标题(Page Header) 页面标题(Page Header)是个不错的功能,它会在网页标题四周添加 ...

  8. [转]Android-Studio 常用配置项

    更多内容可参考:http://www.cnblogs.com/smyhvae/p/4390905.html 1. 想要和 Eclipse 一样,Alt + / 出现自动提示列表:在如下位置修改 2. ...

  9. [LigerUI]使用记录

    1. 下拉框设定 鼠标移开隐藏 但想改变下拉框大小时 很难一次定位到下拉框右下角那个点 2. ligerTab 自带标题菜单 但想修改成类似于 chrome 的标题菜单时 貌似没有找到方法 我用 ea ...

  10. python socket 详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...