标签: 【消息持久化】ActiveMQ持久订阅设置
通过为发布者设置 PERSISTENT传送模式,为订阅者时使用持久订阅,这样可以保证 Pub/Sub 程序接收所有发布的消息。
消息订阅分为非持久订阅(non-durable subscription)和持久订阅(durable subscription),非持久订阅只有当客户端处于激活状态,也就是和 ActiveMQ 保持连接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到。持久订阅时,客户端向ActiveMQ 注册一个识别自己身份的 ID,当这个客户端处于离线时,ActiveMQ会为这个 ID 保存所有发送到主题的消息,当客户端再次连接到ActiveMQ 时, 会根据自己的 ID 得到所有当自己处于离线时发送到主题的消息。持久订阅会增加开销,同一时间在持久订阅中只有一个激活的用户。 建立持久订阅的步骤:
1. 为连接设置一个客户 ID;
2. 为订阅的主题指定一个订阅名称;
上述组合必须唯一。
代码实现持久化订阅(1)使用queue,即队列时,每个消息只有一个消费者,所以,持久化很简单,只要保存到数据库即可 。然后,随便一个消费者取走处理即可。某个消费者关掉一阵子,也无所谓。 (2)使用topic,即订阅时,每个消息可以有多个消费者,就麻烦一些。 首先,假设消费者都是普通的消费者, ,这个消息就被抛弃了。 <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区分消费者,是通过clientID和订户名称来区分的。 // 创建session // 创建destination //MessageConsumer consumer = session.createConsumer(topic); //普通订阅
(5)使用相同的“clientID”,则认为是同一个消费者。两个程序使用相同的“clientID”,则同时只能有一个连接到activemq,第二个连接的会报错。 (6)activemq的设置在conf/activemq.xml中,默认消息是保存在data/kahadb中,重启activemq消息不会丢。 可以访问http://localhost:8161/admin/index.jsp:查看当前的队列、Topic和持久订户的信息、发送消息等等,很方便。 可以复制activemq-jdbc.xml中的内容过来,修改一下,就可以把消息保存在其它数据库中了。 标签: 原文地址:http://www.cnblogs.com/lsx1993/p/4626665.html |
|
来自: WindySky > 《ActiveMQ》