我正在研究ActiveMQ,以了解它是否适用于项目。我需要演示的当前用例是,后期加入的订户将收到在创建订户之前发布的主题。 ActiveMQ追溯消费者似乎可以满足此需求,但我无法使代码正常工作。
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("[url]");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createTopic("testAddress?consumer.retroactive=true");
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("Hello, World!");
producer.send(message);
Thread.sleep(5000);
session.createConsumer(destination).setMessageListener(message2 -> processMessage(message2));
session.close();
connection.close();
connectionFactory.close();
我在这里要演示的是可以发布主题,然后在任意时间(例如5秒)后,消费者可以订阅该主题并接收上一条消息。
据我所知,问题似乎在于创建主题会创建地址,但不会创建任何关联的队列。如果我在建立队列之前将主题发送到地址(通过代码或通过Web界面手动发送到代理),该消息似乎将被忽略,并且“未路由的消息计数”会立即增加。
ActiveMQ文档(https://activemq.apache.org/retroactive-consumer)没有提供更多关于如何设置追溯使用者的详细信息,而不是在创建主题时附加“?consumer.retroactive = true”,因此,我想知道是否有一些细节其他我缺少的配置方面。
答案 0 :(得分:2)
据我所知,ActiveMQ Artemis不支持5.x的追溯用户功能。客户端选项只是告诉经纪人您想要它,但是由于Artemis不处理,因此发送它不会有任何区别。不应依赖5.x中的功能本身作为持久消费者的100%支持,例如,代理重新启动将导致所有那些消息(其中存储的数量是有限的)丢失。
如果您想保证当主题使用者处于脱机状态时收到消息,则持久使用者是这样做的安全方法
答案 1 :(得分:0)
要在ActiveMQ Artemis中完成所需的行为(订阅者收到在订阅之前发布的主题),我使用了具有无损读取的“最后一个值队列”。这样做的局限性在于,我只能收到发布的主题的最新副本,但这对我的情况有用。