【问题标题】:TimeToLive in JMS Producer kills my MessageJMS Producer 中的 TimeToLive 杀死了我的消息
【发布时间】:2016-10-02 06:06:01
【问题描述】:

如果我在我的 Producer 中设置 TimeToLive,我的 Subscriber 不会收到任何消息。我使用 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!为什么?哪里错了?

谢谢

【问题讨论】:

  • 这是什么问题,问题是什么,TTL 正是这样做的
  • 抱歉,首先我启动了我的 consumerListener,然后我启动了我的 producer。如果没有 TTL,我会在不到 1 秒的时间内收到消息。在我的生产者中,将 TTL 设置为 10 秒 - 所以我希望消费者收到带有和不带有 TTL 的消息。我预计,如果我在发送消息后超过 10 秒启动消费者,那么我不会收到消息

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      相关资源
      最近更新 更多