JMS消息重新传递延迟

egb*_*kul 9 jms message-queue openmq

我有一个JMS客户端,可以在收到消息时ssh到远程系统(并在那里做各种事情 - 与问题无关).数百个这样的消息可能会在很短的时间内到达,需要尽快处理.

但是,当收到消息时,某些远程系统也可能不可用,因此应将它们推迟到稍后(例如1小时左右).最好的解决方案是将消息放回队列并设置一些"延迟"值,这将告诉JMS代理不要在一小时内再次尝试传递消息.

什么不行:睡在接收线程中并在一小时后醒来.由于消息消费者池是有限的(例如,8个可用的连接),具有8个不可到达的系统将不必要地阻止整个处理,这是不可接受的.

对于这样的"延迟"值,我没有找到消息或队列本身的设置,它是否存在?

解决方法是使用第二个队列将消息存储到无法访问的系统,并单独处理这些消息.但它不是一个非常优雅的解决方案,需要额外的编程.也许有更好的方法.

Sha*_*shi 9

JMS 2.0规范定义了"传递延迟",其中客户端可以为其发送的每条消息指定传递延迟值(以毫秒为单位).此值定义消息传递时间,即消息的传递延迟和发送的GMT的总和(对于事务发送,这是客户端发送消息的时间,而不是事务提交的时间).

消息的传递时间是JMS提供者可以在目标目标上显示消息并可供消费者传递的最早时间.提供商不得在达到交付时间之前发送消息.

此功能对于上述场景非常方便.


T.R*_*Rob 4

这是无法通过 JMS 2.0 之前的 JMS API 实现的。作为一般规则,消息传输经过优化以尽可能快地传递消息,并且缺乏调度程序来保存消息以便以任意时间间隔重新传递。假设有一个传输提供程序确实具有此类功能,那么您编写的任何内容都将绑定到该传输提供程序,因为尽管代码可能符合 JMS,但应用程序本身将依赖于此特定于供应商的行为。

请参阅@Shashi 的答案,了解适用于支持 JMS 2.0 的 MQ 版本的答案。