ActiveMQ消息持久化订阅

在之前的介绍中,我们了解到在ActiveMQ中默认的Queue模式下,我们的消息是会进行持久化的,我们也介绍了其相关的机制,见ActiveMQ存储的持久化机制,而在Topic模式下,消息在消费者消费的情况下,以及ActiveMQ服务重启的时候,会发送丢失的情况的。


ActiveMQ存储的持久化机制中,我们介绍了是可以将消息的持久化到数据库的,ActiveMQ启动时会自动帮我们生成三张表的——ACTIVEMAQ_ACKSACTIVEMQ_LOCKACTIVEMQ_MSGS,其中ACTIVEMQ_MSGS是用来存储用于存储消息,Queue和Topic都存储在这个表中的。


那么我们就会思考了,Topic模式消息就丢失了,怎么还需要进行存储呢?那肯定是因为我们可以进行相关的配置,让Topic模式也和Queue模式一样进行持久化,那么该如何设置呢?


这里我们还是先来以使用原生ActiveMQ的API编程中的代码为例,其中我们以Topic模式来进行收发消息,其中消息的生产者,我们不需要做任何改动,这里只要对消费者进行改动即可:

  1. 需要设置客户端id:connection.setClientID("xxx");
  2. 将消息的目的地Destination变为Topic
  3. 将消费者类型MessageConsumer变为TopicSubscriber
  4. 消费者创建时变为session.createDurableSubscriber(topic, "任意名字,代表订阅名 ");
  5. 首次需要运行一次消费者,将消费者在ActiveMQ上进行一次注册

接下来,我们来看看代码中的修改,如下我们先增加了其上述说的定义变量
在这里插入图片描述


然后我们就来看看其实际的操作步骤,如下:
在这里插入图片描述


这样我们就完成了ActiveMQ中的Topic持久化订阅了,生产者里不用修改,代码见使用原生ActiveMQ的API编程的Topic消息生产者代码。


接下来我们就来进行测试,这里我们需要注意的是,在我们Topic第一次持久化订阅的时候,我们一定要先启动消息的消费者,主要是为了让消费者在ActiveMQ上进行一次注册。然后就可以在ActiveMQ的管理控制台subscribers页面可以看见我们的消费者。如下:
在这里插入图片描述

第一栏就是活跃持久化Topic订阅者

第二个为不活跃的持久化订阅者,当我们将消费者服务结束,我们就会在第二个栏中看到它

第三个为未持久化的Topic订阅者,就是我们普通的Topic消费者启动会这这里出现,这里还包括了我们的活跃持久化Topic订阅者,即第一栏内容



除此之外,我们还在ActiveMQ存储的持久化机制中,介绍数据库进行持久化的时候,说过了生成的三种表,其中ACTIVEMAQ_ACKS是用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存,这里我们就来查看下这种表,如下:
在这里插入图片描述
在第一次启动持久化订阅的Topic消费者后,其订阅关系就被存储下来的,这里只要不删除该条记录,下次我们就无需指定生产者、消费者启动的顺序了。


这里我们就可以进行测试,无论是先启动生产者发送消息,在启动消费者进行消费;还是再发送完消息后,重启ActiveMQ服务后,再启动消费者进行消费都是可以了,因为这里我们的消息就和Queue模式下的一致,被存储在ACTIVEMQ_MSGS表中了,只有当所有持久化订阅的Topic消费者消费了,才会被删除。


如果想要启动多个持久化订阅的消费者,这里我们可以设置不同的ClientID,即connection.setClientID("xxx");



注意:生产者端无需另外单独配置,但是在一些特殊的情况下,生产者也是可以在持久化订阅的Topic模式下,进行相关设置的,如
topicSubscriber = session.createDurableSubscriber(topic, "bxs");
在这里插入图片描述

上述是用来设置消息本身的持久化属性为非持久化。其主要不同点在于:当生产者发送消息后,关闭ActiveMQ服务再启动服务,然后再去启动消费者消费消息,即使Topic是进行了持久化订阅的,这里也接受不到消息了,因为消息已经丢失了。


即说明,即使进行了持久订阅,但是消息本身如果是不持久化的,ActiveMQ关闭再启动,这些非持久化的消息会丢失,进行持久订阅的消费者也是收不到自身离线期间的消息的。


当然如果ActiveMQ服务未重启,那么先启动生产者,再启动消费者,这样还是可以消费到消息的,所以这里意思就是相当于消息只在内存中保存,不进行持久化,ActiveMQ服务重启即丢失。


我们在ActiveMQ存储的持久化机制中介绍的Memory消息存储就和设置topicSubscriber = session.createDurableSubscriber(topic, "bxs");类似,就是我们在进行了持久化Topic模式的订阅,但是我们在ActiveMQ配置文件中,配置了Memory消息存储,即设置了persistent=false,那么效果和上述一致。




然后我们再来看看在SpringBoot中的用法,这里ActiveMQ和SpringBoot结合可见ActivaMQ与SpringBoot结合,其中我们介绍过如何在SpringBoot中使用Topic模式的消息,就是在其ActiveMQ的配置类中,再加上一个配置,这里我们在其配置中,再加上开启持久化订阅的设置即可,如下:
在这里插入图片描述




最后我们来简单看下Spring中如何设置持久化订阅Topic,其实也是十分的简单,同样的,这里我们借助于ActivaMQ与Spring结合 ,然后在其中的进行修改,这里还是只需要修改消费者的配置文件,如下:
在这里插入图片描述


那么不使用jms标签又该如何设置呢?有关不使用jms标签,来设置Topic模式在ActivaMQ与Spring结合 已介绍,这里我们在其基础上进行修改,如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章