Frage

Ich lerne, wie ActiveMQ zu nutzen und jetzt stehen wir folgendes Problem.

Nehmen wir an, dass ich ein Thema mit dem Namen topic.test auf ActiveMQ, die zwei Teilnehmer haben. In einem bestimmten Moment habe ich nur eine dieser Teilnehmer für Nachrichten warten, und ein Produzent eine Nachricht für das Thema sendet ich oben erwähnt.

Ok, der angeschlossene Teilnehmer die Nachricht bekommen, sollen aber nicht die anderen Teilnehmer die Nachricht später empfangen, wenn er angeschlossen ist? Nun, in meinem Fall ist es passiert nicht: meine Abonnenten nur Nachrichten empfangen, während verbunden. Alle anderen Nachrichten, die gesendet wurden, während sie waren nicht verbunden sind, nicht von ihnen empfangen werden. Was könnte ich falsch tun?

Hier ist ein Teil des Quellcodes Ich schrieb ActiveMQ zu testen. Vielleicht könnten Sie finden, was mit ihm nicht stimmt.

Mein consummer Code:

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

Und hier ist mein Produzent Code:

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

Gibt es eine andere Konfiguration, die ich zu ActiveMQ hinzufügen sollte, so dass meine Verbraucher ältere Nachrichten bekommen?

War es hilfreich?

Lösung

Sie müssen die Verbraucher „permanent“ machen. Andernfalls AMQ „vergisst“ über sie, sobald sie wieder abmelden. Um dies zu tun, verwenden Sie Session.createDurableSubscriber()

Andere Tipps

Es gibt etwas namens eine rückwirkende Verbraucher Politik, die Sie auch auf dem Broker einstellen . Dies ist für Abonnenten Thema - die nicht haltbar sind, aber ich wünschte, kann ‚jüngsten‘ Nachrichten empfangen sie verpasst haben - siehe auch Abonnement Wiederherstellungsrichtlinie

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top