JMS Producer 中的 TimeToLive 杀死了我的消息
TimeToLive in JMS Producer kills my Message
如果我在 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!为什么?哪里错了?
谢谢
可能是你的客户端和服务器的系统时钟不同步。
Nicholas说的应该是吧。消费者和代理系统时钟不同步。
我正在使用 ActiveMQ 5.14.5 并且遇到了与我 "solved" 相同的问题,方法是将 ActiveMQConnectionFactory 的 "consumerExpiryCheckEnabled" 属性 设置为 'false'。
这样,消费者仍然可以接收和发送消息,而无需更改消息 'time-to-live' 或保证消费者和代理系统时钟同步。
请注意,我使用此解决方案是因为:
- 我无法同步系统时钟。
- 我使用 'time-to-live' 只是为了限制队列大小,即接收 "already expired" 消息没有问题。
如果我在 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!为什么?哪里错了?
谢谢
可能是你的客户端和服务器的系统时钟不同步。
Nicholas说的应该是吧。消费者和代理系统时钟不同步。
我正在使用 ActiveMQ 5.14.5 并且遇到了与我 "solved" 相同的问题,方法是将 ActiveMQConnectionFactory 的 "consumerExpiryCheckEnabled" 属性 设置为 'false'。
这样,消费者仍然可以接收和发送消息,而无需更改消息 'time-to-live' 或保证消费者和代理系统时钟同步。
请注意,我使用此解决方案是因为:
- 我无法同步系统时钟。
- 我使用 'time-to-live' 只是为了限制队列大小,即接收 "already expired" 消息没有问题。