Java JMS Producer中的TimeToLive将终止我的消息

Java JMS Producer中的TimeToLive将终止我的消息,java,jms,activemq,producer-consumer,jms-topic,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 Topi

如果我在我的制作人中设置了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可能是您的客户端和服务器的系统时钟不同步。

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

可能是Nicholas说的。消费者和代理系统时钟不同步

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

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

  • 我无法同步系统时钟
  • 我使用“生存时间”只是为了限制队列大小,也就是说,接收“已过期”消息没有问题

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

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

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

  • 我无法同步系统时钟
  • 我使用“生存时间”只是为了限制队列大小,也就是说,接收“已过期”消息没有问题

  • 这是一个怎样的问题,问题是什么,TTL就是这么做的对不起,首先我开始我的消费者新闻,然后我开始我的制作人。如果没有TTL,我会在不到1秒的时间内收到消息。在我的示例中,producer设置为10秒TTL,因此我希望消费者在有TTL和无TTL的情况下都能收到消息。我想,如果我在发送信息后超过10秒启动我的消费者,那么我没有收到信息这是一个什么问题,问题是什么,TTL就是这么做的对不起,首先我启动我的消费者侦听器,然后我启动我的制作人。如果没有TTL,我会在不到1秒的时间内收到消息。在我的示例中,producer设置为10秒TTL,因此我希望消费者在有TTL和无TTL的情况下都能收到消息。我预计,如果我在发送消息后超过10秒启动我的消费者,那么我就不会收到消息