JMS 稍后传递消息
JMS deliver message at later time
我试图在一段时间后传递 JMS 消息,我最初的想法是使用到期队列并将消息放入没有任何消费者的队列中。所以我有 3 个默认队列:
- WaitQueue -(这个的到期队列设置为 SendQueue)
- SendQueue - 这个有处理消息的消费者(默认情况下这个有 expiryQueue 作为它的超时队列)
- ExpiryQueue - 默认 jboss 所有真正过期(非故意)的消息队列
在 WaitQueue 中插入一条消息,我的预期延迟为 TimeToLive,在时间到期后,我希望看到 SendQueue 中的消息(以及消费者处理它们),但是它保持为空,消息直接转到ExpiryQueue,有什么问题吗?
SendQueue 的统计数据显示 "Received messages" 增加,但当前消息保持为 0,因此它们到达但立即转发到最后一个 ExpiryQueue。
而不是使用资源密集型的过期队列方法;您可以考虑在消息级别使用传递延迟。
如果是HornetQ,你可以设置属性 _HQ_SCHED_DELIVERY。
https://docs.jboss.org/hornetq/2.3.0.Final/docs/user-manual/html/scheduled-messages.html
TextMessage message = session.createTextMessage("This is a scheduled message message which will be delivered in 5 sec.");
message.setLongProperty("_HQ_SCHED_DELIVERY", System.currentTimeMillis() + 5000);
producer.send(message);
从 JMS2.0 (JavaEE7) 开始,这个 属性 也可以在 MessageProducer 上设置。参见 https://github.com/jboss/jboss-jms-api_spec/blob/master/src/main/java/javax/jms/MessageProducer.java#L285
我试图在一段时间后传递 JMS 消息,我最初的想法是使用到期队列并将消息放入没有任何消费者的队列中。所以我有 3 个默认队列:
- WaitQueue -(这个的到期队列设置为 SendQueue)
- SendQueue - 这个有处理消息的消费者(默认情况下这个有 expiryQueue 作为它的超时队列)
- ExpiryQueue - 默认 jboss 所有真正过期(非故意)的消息队列
在 WaitQueue 中插入一条消息,我的预期延迟为 TimeToLive,在时间到期后,我希望看到 SendQueue 中的消息(以及消费者处理它们),但是它保持为空,消息直接转到ExpiryQueue,有什么问题吗?
SendQueue 的统计数据显示 "Received messages" 增加,但当前消息保持为 0,因此它们到达但立即转发到最后一个 ExpiryQueue。
而不是使用资源密集型的过期队列方法;您可以考虑在消息级别使用传递延迟。
如果是HornetQ,你可以设置属性 _HQ_SCHED_DELIVERY。 https://docs.jboss.org/hornetq/2.3.0.Final/docs/user-manual/html/scheduled-messages.html
TextMessage message = session.createTextMessage("This is a scheduled message message which will be delivered in 5 sec.");
message.setLongProperty("_HQ_SCHED_DELIVERY", System.currentTimeMillis() + 5000);
producer.send(message);
从 JMS2.0 (JavaEE7) 开始,这个 属性 也可以在 MessageProducer 上设置。参见 https://github.com/jboss/jboss-jms-api_spec/blob/master/src/main/java/javax/jms/MessageProducer.java#L285