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