zoukankan      html  css  js  c++  java
  • 基于ActiveMQ的Topic的数据同步——消费者持久化

    前面一章中介绍了activemq的初步实现:基于ActiveMQ的Topic的数据同步——初步实现

    下面来解决持久化订阅的问题:

    (1)使用queue,即队列时,每个消息只有一个消费者,所以,持久化很简单,只要保存到数据库即可

    。然后,随便一个消费者取走处理即可。某个消费者关掉一阵子,也无所谓。

    (2)使用topic,即订阅时,每个消息可以有多个消费者,就麻烦一些。

    首先,假设消费者都是普通的消费者,
    ------------------------
    <1>activemq启动后,发布消息1,可惜,现在没有消费者启动着,也就是没有消费者进行了订阅。那么

    ,这个消息就被抛弃了。

    <2>消费者1启动了,连接了activemq,进行了订阅,在等待消息~~

    activemq发布消息2,OK,消费者1收到,并进行处理。消息抛弃。

    <3>消费者2也启动了,连接了activemq,进行了订阅,在等待消息~~

    activemq发布消息3,OK,消费者1,消费者2都收到,并进行处理。消息抛弃。

    <4>消费者1关掉了。

    activemq发布消息4,OK,消费者2收到,并进行处理。消息抛弃。

    <5>消费者1又启动了。

    activemq发布消息5,OK,消费者1,消费者2都收到,并进行处理。消息抛弃。
    -----------------------------
    总结一下:
    activemq只是向当前启动的消费者发送消息。
    关掉的消费者,会错过很多消息,并无法再次接收这些消息。

    如果发送的消息是重要的用户同步数据,错过了,用户数据就不同步了。

    那么,如何让消费者重新启动时,接收到错过的消息呢?

    答案是持久订阅。

    (3)普通的订阅,不区分消费者,场地里有几个人头,就扔几个馒头。
    持久订阅,就要记录消费者的名字了。
    张三说,我是张三,有馒头给我留着,我回来拿。
    李四说,我是李四,有馒头给我留着,我回来拿。
    activemq就记下张三,李四两个名字。

    那么,分馒头时,还是一个人头给一个馒头。
    分完了,一看张三没说话,说明他不在,给他留一个。
    李四说话了,那就不用留了。

    张三回来了,找activemq,一看,这不张三吧,快把他的馒头拿来。
    可能是一个馒头,也可能是100个馒头,就看张三离开这阵子,分了多少次馒头了。

    原理讲完,下面是配置实现:

    修改jms-receiver.xml:原来的同样位置改成这样就可以了。在发送者中不用设置clinetIDPrefix属性也可以。

    <!--异步调用消息 -->  
        <bean id="receive"  
            class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
            <property name="connectionFactory" ref="jmsReceiverFactory"></property>  
            <property name="destination" ref="destination"></property>  
            <property name="messageListener" ref="messageListener"></property>
            <property name="subscriptionDurable" value="true"></property>
            <property name="clientId" value="www_01"></property>  
            <property name="durableSubscriptionName" value="www"></property>
        </bean>  

    以下是mq中的截图:

  • 相关阅读:
    遗传算法(Genetic Algorithm, GA)及MATLAB实现
    CCF CSP 201809-2 买菜
    PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题 (20 分)
    PAT (Basic Level) Practice (中文)1006 换个格式输出整数 (15 分)
    PAT (Basic Level) Practice (中文)1004 成绩排名 (20 分)
    PAT (Basic Level) Practice (中文)1002 写出这个数 (20 分)
    PAT (Advanced Level) Practice 1001 A+B Format (20 分)
    BP神经网络(原理及MATLAB实现)
    问题 1676: 算法2-8~2-11:链表的基本操作
    问题 1744: 畅通工程 (并查集)
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/6423770.html
Copyright © 2011-2022 走看看