我正在学习如何使用ActiveMQ,现在我们面临以下问题。
假设我在ActiveMQ上有一个名为topic.test的主题,该主题有两个订阅者。 在给定的时刻,我只有其中一个订阅者等待消息,并且生产者发送了我上面提到的主题的消息。
好的,连接的用户收到消息,但是其他用户在连接时不应该收到该消息?好吧,就我而言,它没有发生:我的订阅者只在连接时收到消息。所有其他消息在他们未连接时发送的消息都没有被他们接收。我能做错什么?
以下是我为测试ActiveMQ而编写的一些源代码。也许你可以找到它的错误。
我的消费者代码:
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
connection.setClientID("leitorTeste");
conexao.start();
Session sessao = conexao.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic fonte = sessao.createTopic("topic.test");
MessageConsumer consumer = sessao.createConsumer(fonte);
javax.jms.Message presente = null;
while ((presente = consumer.receive()) != null) {
System.out.println(((TextMessage) presente).getText());
}
consumer.setMessageListener(new LeitorMensagens());
conexao.close();
这是我的制片人代码:
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
Session sessao = conexao.createSession(true, Session.AUTO_ACKNOWLEDGE);
connection.start();
Destination destino = sessao.createTopic("topic.test");
MessageProducer produtorMensagem = sessao.createProducer(destino);
produtorMensagem.setDeliveryMode(DeliveryMode.PERSISTENT);
TextMessage message = sessao.createTextMessage("Hi!");
produtorMensagem.send(message);
sessao.commit();
connection.close();
我应该向ActiveMQ添加任何其他配置,以便我的消费者可以收到更旧的消息吗?
答案 0 :(得分:6)
您必须让您的消费者“永久”。否则,AMQ会在取消订阅后立即“忘记”他们。为此,请使用Session.createDurableSubscriber()
答案 1 :(得分:1)
您还可以在代理上设置称为retroactive consumer策略的内容。这是针对主题订阅者 - 这些订阅者不耐用,但可能希望收到他们可能错过的“最近”消息 - 另请参阅Subscription Recovery Policy