JMS Producer中的TimeToLive终止了我的消息

时间:2016-06-02 13:13:23

标签: java jms activemq producer-consumer jms-topic

如果我在制作人中设置了TimeToLive,我的订阅者就不会收到任何消息。我使用activeMQ V. 5.13.3作为消息代理。

我的制片人

javax.naming.Context ctx = new InitialContext();
// lookup the connection factory
factory = (javax.jms.TopicConnectionFactory)ctx.lookup("ConnectionFactory");
// create a new TopicConnection for pub/sub messaging
connection = factory.createConnection("user", "pwd");
// lookup an existing topic
destination = (javax.jms.Topic)ctx.lookup("MyTopic");
// create a new TopicSession for the client
session = connection.createSession(false, TopicSession.AUTO_ACKNOWLEDGE);

connection.start();

producer = session.createProducer(destination);
producer.setTimeToLive(10000);

TextMessage message = session.createTextMessage();
message.setText("The Message");
producer.send(message);

我的消费者

javax.naming.Context ctx = new InitialContext();
// lookup the connection factory
factory = (javax.jms.TopicConnectionFactory)ctx.lookup("ConnectionFactory");
// create a new TopicConnection for pub/sub messaging
connection = factory.createConnection("user", "pwd");
connection.setClientID("ClientID-"+id);
connection.start();
// lookup an existing topic
destination = (javax.jms.Topic)ctx.lookup("MyTopic");
// create a new TopicSession for the client
session = connection.createSession(false, TopicSession.AUTO_ACKNOWLEDGE);

consumer = session.createDurableSubscriber(destination, id);

consumer.setMessageListener(new MessageListenerConsumer("ClientID-"+id));

如果我没有使用setTimeToLive()消费者接收消息,但是使用setTTL()消息不会到达消费者 - 不会少于或多于定义的10秒TTL!为什么?错误在哪里?

Thx

2 个答案:

答案 0 :(得分:2)

可能是您的客户端和服务器的系统时钟不同步。

答案 1 :(得分:0)

这可能是尼古拉斯所说的。消费者和代理系统时钟不同步。

我正在使用ActiveMQ 5.14.5并遇到了同样的问题,我通过将ActiveMQConnectionFactory的“consumerExpiryCheckEnabled”属性设置为“false”来“解决”。
这样,消费者仍然可以接收和发送消息,而无需更改消息的“生存时间”或保证消费者和代理系统时钟同步。

请注意,我正在使用此解决方案,因为:

  1. 我无法同步系统时钟。
  2. 我只使用'生存时间'来限制队列大小,即没有收到“已过期”消息的问题。