为什么JMS MessageProducer方法setTimeToLive或send()不起作用?

时间:2013-02-12 04:46:28

标签: java jms

我尝试使用这两种方法中的任何一种,这样我通过该生产者发送的消息就会过期。例如,我将时间设置为5秒(5 000 ms),但即使在5 s后,我订阅后仍然会收到消费者的消息。我想知道为什么......

2 个答案:

答案 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秒,它将从队列中消失。