Domanda

sto imparando come utilizzare ActiveMQ e ora ci troviamo di fronte il seguente problema.

Supponiamo che ho un argomento di nome topic.test su ActiveMQ che hanno due abbonati. In un dato momento, ho solo uno di quegli abbonati in attesa di messaggi, e un produttore mando un messaggio per il tema che ho citato sopra.

Ok, l'abbonato collegato ottenere il messaggio, ma non dovrebbe l'altro utente riceverà un messaggio che più tardi, quando è collegata? Ebbene, nel mio caso non sta accadendo: i miei iscritti ricevono solo i messaggi durante la connessione. Tutti gli altri messaggi, che sono stati inviati mentre non erano collegati non vengono ricevuti da loro. Che cosa potrei fare male?

Un po 'del codice sorgente che ho scritto per testare ActiveMQ. Forse si potrebbe trovare ciò che è sbagliato con esso.

Il mio codice 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();

E qui è il mio codice produttore:

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

C'è qualche altra configurazione dovrei aggiungere a ActiveMQ in modo che i miei consumatori potrebbero ottenere i messaggi più vecchi?

È stato utile?

Soluzione

È necessario effettuare i vostri consumatori "permanente". In caso contrario, AMQ "dimentica" su di loro non appena si annullare l'iscrizione. Per fare questo, utilizzare Session.createDurableSubscriber()

Altri suggerimenti

C'è una cosa chiamata retroattivo politica dei consumatori è anche possibile impostare il broker . Questo è per Topic abbonati - che non sono durevoli, ma potrebbe desiderare di ricevere messaggi 'recenti' che possono avere perso - vedi anche Abbonamento Recupero privacy

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top