我尝试使用这两种方法中的任何一种,这样我通过该生产者发送的消息就会过期。例如,我将时间设置为5秒(5 000 ms),但即使在5 s后,我订阅后仍然会收到消费者的消息。我想知道为什么......
答案 0 :(得分:1)
规范如下所示,
当达到邮件的到期时间时,提供商应该丢弃 它。 JMS API未定义任何形式的消息通知 过期。客户端不应接收已过期的消息; 但是,JMS API并不保证不会发生这种情况。
所以它完全具体实现。您的发布者/订阅者应该按照JMS规范丢弃过期消息的方式实现,如果不是,即使在到期时间之后您也必须接收这些消息。
答案 1 :(得分: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,您会看到如果您在发送消息后睡眠时间超过1秒,它将从队列中消失。