5

ActiveMQ の使用方法を学んでいますが、現在、次の問題に直面しています。

2 つのサブスクライバーを持つ ActiveMQ に topic.test という名前のトピックがあるとします。ある時点で、メッセージを待っているサブスクライバーは 1 人だけで、プロデューサーは上記のトピックに関するメッセージを送信します。

接続されたサブスクライバーはメッセージを受け取りますが、他のサブスクライバーは後で接続されたときにそのメッセージを受信するべきではありませんか? 私の場合、それは起こっていません。私のサブスクライバーは、接続中にのみメッセージを受信して​​います。接続されていない間に送信された他のすべてのメッセージは、受信されていません。私は何が間違っているのでしょうか?

ActiveMQ をテストするために私が書いたソース コードの一部を次に示します。何が悪いのか分かるかもしれません。

私の消費者コード:

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

そして、ここに私のプロデューサーコードがあります:

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

コンシューマーが古いメッセージを取得できるように、ActiveMQ に追加する必要がある他の構成はありますか?

4

2 に答える 2

6

コンシューマーを「永続的」にする必要があります。そうしないと、AMQ は、購読を解除するとすぐにそれらを「忘れ」ます。これを行うには、Session.createDurableSubscriber()

于 2009-12-03T12:00:32.413 に答える
1

ブローカーにも設定できる遡及消費者ポリシーと呼ばれるものがあります。これは、永続的ではありませんが、見逃した可能性のある「最近の」メッセージを受け取りたい可能性があるトピック サブスクライバー向けです。サブスクリプションの回復ポリシーも参照してください。

于 2009-12-31T09:02:15.950 に答える