zoukankan      html  css  js  c++  java
  • 尝试编写的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执行。

    当然还有一些排序,还有对事件的持久化等还木有完善,但是感觉良好,第一次写框架,感觉自己好差劲,需要加油了~~

  • 相关阅读:
    BZOJ 4318: OSU!
    BZOJ 3450: Tyvj1952 Easy
    BZOJ 1426: 收集邮票
    BZOJ 1415: [Noi2005]聪聪和可可
    BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
    BZOJ 3270: 博物馆
    BZOJ 3143: [Hnoi2013]游走
    BZOJ 3166: [Heoi2013]Alo
    BZOJ 3261: 最大异或和
    BZOJ 1022: [SHOI2008]小约翰的游戏John
  • 原文地址:https://www.cnblogs.com/qiangweikang/p/rabbitmq-spring.html
Copyright © 2011-2022 走看看