1

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

于 2013-02-12T05:18:35.210 回答