Pregunta

Estoy aprendiendo cómo utilizar ActiveMQ y ahora nos encontramos ante el siguiente problema.

Supongamos que tengo un tema llamado topic.test en ActiveMQ que tienen dos abonados. En un momento dado, sólo tengo uno de esos suscriptores en espera de mensajes, y un productor envío un mensaje para el tema que he mencionado anteriormente.

Ok, el abonado conectado llegar el mensaje, pero no debe por otro suscriptor recibir ese mensaje más tarde cuando está conectado? Bueno, en mi caso no está sucediendo: mis suscriptores están recibiendo mensajes mientras está conectado. Todos los otros mensajes, los cuales fueron enviados mientras que no estaban conectados no están siendo recibidos por ellos. ¿Qué podía estar haciendo mal?

Aquí es una parte del código fuente que escribí para probar ActiveMQ. Tal vez usted podría encontrar lo que está mal con él.

Mi código consummer:

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

Y aquí es mi código del productor:

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

¿Hay alguna otra configuración que debería añadir a ActiveMQ para que mis consumidores podrían obtener los mensajes más antiguos?

¿Fue útil?

Solución

Se debe hacer sus consumidores "permanente". De lo contrario, AMQ "olvida" acerca de ellos tan pronto como darse de baja. Para ello, utilice Session.createDurableSubscriber()

Otros consejos

Hay algo que se llama un href="http://activemq.apache.org/retroactive-consumer.html" rel="nofollow noreferrer"> política de los consumidores retroactiva política de suscripción recuperación

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top