我试图在一段时间过后传递JMS消息,我最初的想法是使用到期队列并将消息放入没有任何消费者的队列中。所以我有3个默认队列:
在WaitQueue中插入一条消息,我的预期延迟为TimeToLive,在时间到期后,我希望看到SendQueue中的消息(以及消费者处理它们),但它保持为空,消息直接转到ExpiryQueue,任何想法有什么不对?
SendQueue的统计信息显示"收到的消息"增加,但当前消息保持为0,因此它们到达但会立即转发到最后的ExpiryQueue。
答案 0 :(得分:1)
而不是使用更耗费资源的到期队列方法;您可以考虑在消息级别使用传递延迟。
如果是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