Question

J'apprends comment utiliser ActiveMQ et maintenant nous sommes confrontés au problème suivant.

Supposons que j'ai un sujet nommé topic.test sur ActiveMQ qui ont deux abonnés. Dans un moment donné, je ne dispose que l'un de ces abonnés en attente de messages, et un producteur envoie un message pour le sujet je l'ai mentionné ci-dessus.

Ok, l'abonné connecté passer le message, mais ne doit pas l'autre abonné de recevoir ce message plus tard lorsqu'il est connecté? Eh bien, dans mon cas, il ne se produit pas: mes abonnés ne reçoivent que des messages lorsque vous êtes connecté. Tous les autres messages qui ont été envoyés alors qu'ils ne sont pas connectés ne sont pas reçus par eux. Que pouvais-je faire mal?

Voici le code source que j'ai écrit pour tester ActiveMQ. Peut-être que vous pourriez trouver ce qui ne va pas avec elle.

Mon code CONSOMMATEUR:

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

Et voici mon code producteur:

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

Y at-il autre configuration que je dois ajouter à ActiveMQ pour que mes consommateurs pourraient recevoir des messages plus anciens?

Était-ce utile?

La solution

Vous devez faire vos consommateurs « permanent ». Dans le cas contraire, AMQ « oublie » à leur sujet dès leur désabonnement. Pour ce faire, utilisez Session.createDurableSubscriber()

Autres conseils

Il y a quelque chose appelé la politique des consommateurs rétroactive vous pouvez également définir le courtier . Ceci est pour les abonnés Sujet - qui ne sont pas durables, mais peut souhaiter recevoir des messages « récents », ils ont pu manquer - voir aussi abonnement Politique de récupération

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top