我尝试使用这两种方法中的任何一种,以便我通过该生产者发送的消息将过期。例如,我将生存时间设置为 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 = 1s,你会看到如果你在发送消息后睡眠超过1s,它就会从队列中消失。
于 2013-02-12T05:18:35.210 回答