1

そのプロデューサーを介して送信したメッセージの有効期限が切れるように、これら2つの方法のいずれかを使用しようとしました。たとえば、有効期限を 5 秒 (5 000 ミリ秒) に設定しましたが、5 秒後でも、サブスクライブした後でも消費者からメッセージを受け取ります。なぜだろう...

4

2 に答える 2

1

仕様書には以下のように記載されています。

メッセージの有効期限に達すると、プロバイダーはメッセージを破棄する必要があります。JMS API では、メッセージの有効期限を通知する形式は定義されていません。クライアントは期限切れのメッセージを受信すべきではありません。ただし、JMS API は、これが起こらないことを保証しません。

そのため、完全に実装固有です。パブリッシャー/サブスクライバーは、JMS 仕様に従って期限切れのメッセージを破棄するように実装する必要があります。そうしないと、有効期限が切れた後でもメッセージを受信する必要があります。

于 2013-02-12T05:18:30.263 に答える
1

多分あなたは何か間違ったことをしている. 私のテストを試してください

    String url = "tcp://localhost:61616";
    BrokerService broker = new BrokerService();
    broker.addConnector(url);
    broker.start();

    ConnectionFactory cf = new ActiveMQConnectionFactory(url);
    Connection conn = cf.createConnection();
    Session s = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
    ActiveMQQueue q = new ActiveMQQueue("test");

    MessageProducer p = s.createProducer(q);
    p.send(s.createTextMessage("!!!!"), DeliveryMode.NON_PERSISTENT, 0, 1000);  // ttl = 1s

    Thread.sleep(2000);

    MessageConsumer c = s.createConsumer(q);
    System.out.println("Received: " + c.receiveNoWait());

    System.exit(1);

activemq-all-5.6.0.jar を使用し、TTL = 1 秒です。メッセージを送信した後に 1 秒以上スリープすると、メッセージがキューから消えることがわかります。

于 2013-02-12T05:18:35.210 に答える