ActiveMQ: como dequeue mensagens mais antigas?
Pergunta
Eu estou aprendendo a usar ActiveMQ e agora estamos enfrentando o seguinte problema.
Suponha que eu tenho um tópico chamado topic.test em ActiveMQ que tem dois assinantes. Em um dado momento, só tenho um desses assinantes à espera de mensagens, e um produtor enviar uma mensagem para o tópico que eu mencionei acima.
Ok, o assinante conectado receber a mensagem, mas o outro assinante não deve receber essa mensagem mais tarde, quando ele está conectado? Bem, no meu caso isso não está acontecendo: os meus assinantes apenas estão a receber mensagens enquanto conectado. Todas as outras mensagens, que foram enviados, enquanto eles não estavam ligados não estão sendo recebidos por eles. O que eu poderia estar fazendo de errado?
Aqui você encontra o código fonte que eu escrevi para testar ActiveMQ. Talvez você possa encontrar o que está errado com ele.
Meu código consumidor dos:
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();
E aqui está o meu código do produtor:
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();
Existe alguma outra configuração que eu deveria adicionar à ActiveMQ para que meus consumidores poderiam obter mensagens mais antigas?
Solução
Você deve fazer seus consumidores "permanente". Caso contrário, AMQ "esquece" sobre-los logo que eles unsubscribe. Para fazer isso, use Session.createDurableSubscriber()
Outras dicas
Não é uma coisa chamada política dos consumidores retroativo você também pode definir o corretor . Isto é para Assinantes Tópico - que não são duráveis, mas pode desejar receber mensagens 'recentes' que eles podem ter perdido - ver também Assinatura política de Recuperação