ActiveMQ持久订阅设置
通过为发布者设置 PERSISTENT传送模式,为订阅者时利用持久订阅,这样可以担保 Pub/Sub 程序吸收所有发布的。
订阅分为非持久订阅(non-durable subscription)和持久订阅(durable subscription),非持久订阅只有当客户端处于激活状态,也便是和 ActiveMQ 保持连接状态才能收到发送到某个主题的,而当客户端处于离线状态,这个韶光段发到主题的将会丢失,永久不会收到。持久订阅时,客户端向ActiveMQ 注册一个识别自己身份的 ID,当这个客户端处于离线时,ActiveMQ会为这个 ID 保存所有发送到主题的,当客户端再次连接到ActiveMQ 时, 会根据自己的 ID 得到所有当自己处于离线时发送到主题的。持久订阅会增加开销,同一韶光在持久订阅中只有一个激活的用户。 建立持久订阅的步骤:
1. 为连接设置一个客户 ID;
2. 为订阅的主题指定一个订阅名称;
上述组合必须唯一。
代码实现持久化订阅(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只是向当前启动的消费者发送。
关掉的消费者,会错过很多,并无法再次吸收这些。
如果发送的是主要的用户同步数据,错过了,用户数据就不同步了。
那么,如何让消费者重新启动时,吸收到错过的呢?
答案是持久订阅。
-----------------------------
普通的订阅,不区分消费者,园地里有几个人头,就扔几个馒头。
持久订阅,就要记录消费者的名字了。
张三说,我是张三,有馒头给我留着,我回来拿。
李四说,我是李四,有馒头给我留着,我回来拿。
activemq就记下张三,李四两个名字。
那么,分馒头时,还是一个人头给一个馒头。
分完了,一看张三没说话,解释他不在,给他留一个。
李四说话了,那就不用留了。
张三回来了,找activemq,一看,这不张三吧,快把他的馒头拿来。
可能是一个馒头,也可能是100个馒头,就看张三离开这阵子,分了多少次馒头了。
activemq区分消费者,是通过clientID和订户名称来区分的。
-----------------------------
// 创建connection
connection = connectionFactory.createConnection();
connection.setClientID(\"大众bbb\"大众); //持久订阅须要设置这个。
connection.start();
// 创建session
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
// 创建destination
Topic topic = session.createTopic(\公众userSyncTopic\"大众); //Topic名称
//MessageConsumer consumer = session.createConsumer(topic); //普通订阅
MessageConsumer consumer = session.createDurableSubscriber(topic,\"大众bbb\公众); //持久订阅
还有一点,的生产者,发送时用利用持久模式
MessageProducer producer = ...;
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
不设置,默认便是持久的
(5)利用相同的“clientID”,则认为是同一个消费者。两个程序利用相同的“clientID”,则同时只能有一个连接到activemq,第二个连接的会报错。
(6)activemq的设置在conf/activemq.xml中,默认是保存在data/kahadb中,重启activemq不会丢。
可以访问http://localhost:8161/admin/index.jsp:查看当前的行列步队、Topic和持久订户的信息、发送等等,很方便。
可以复制activemq-jdbc.xml中的内容过来,修正一下,就可以把保存在其它数据库中了。