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?

Foi útil?

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()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top