您如何协调 JMS 浏览器和消费者?
How can you coordinate JMS browser and consumer?
我正在编写一个实用程序来处理 REPLAY 队列消息。
我打算使用 QueueBrowser 逐条消息来决定需要做什么。当我遇到不到 15 分钟的消息时,我想停止。这是这样的,例如发生几分钟的数据库超时不会再次发生。如果较旧,我想通过 MessageConsumer 使用消息并将其放在原来的队列中。
关于做什么还有其他规则。巧妙地做到这一点的唯一方法(即不必重新发布我想留在 REPLAY 队列中的消息,BTW 会增加 JMSXDeliveryCount 并最终将消息放在队列中的不同位置)是协调浏览器和消费者。
因此我的问题是:这个设计可行吗?即我可以在浏览器正在处理的同一消息上使用消费者吗?还是我必须硬着头皮只使用消费者?
有没有办法消费浏览器刚刚返回的消息?
关于15分钟的界限:
您可以选择定义消息选择器,这样您将只看到 JMSTimestamp
消息 header 字段值大于过去 15 分钟的消息。规范规定此 header 字段的格式必须遵循与 System.currentTimeMillis()
返回的格式相同的格式,因此您所要做的就是进行该调用并减去相当于 15 分钟的时间 (15 * 60 * 1000)
:
System.currentTimeMillis() - 900000
定义选择器。如果选择此选项,您将永远不会看到不符合选择器定义的条件的消息,这将缓解您提出的有关消息处理的一些问题。
关于向 Queue 返回消息:
您可以选择构建消费 Session
以使用 CLIENT_ACKNOWLEDGE
消息传递模型。使用这种形式的消息确认,可以从 queue 检索消息,但在客户端调用消息的 acknowledge()
方法之前不会真正认为已传递。因此,如果您不进行 acknowledge()
调用,该消息将在 queue 上对其他消费者保持可用,并且它避免了与消息重新发布、delivery-count、消息排序等相关的问题.
我正在编写一个实用程序来处理 REPLAY 队列消息。
我打算使用 QueueBrowser 逐条消息来决定需要做什么。当我遇到不到 15 分钟的消息时,我想停止。这是这样的,例如发生几分钟的数据库超时不会再次发生。如果较旧,我想通过 MessageConsumer 使用消息并将其放在原来的队列中。
关于做什么还有其他规则。巧妙地做到这一点的唯一方法(即不必重新发布我想留在 REPLAY 队列中的消息,BTW 会增加 JMSXDeliveryCount 并最终将消息放在队列中的不同位置)是协调浏览器和消费者。
因此我的问题是:这个设计可行吗?即我可以在浏览器正在处理的同一消息上使用消费者吗?还是我必须硬着头皮只使用消费者?
有没有办法消费浏览器刚刚返回的消息?
关于15分钟的界限:
您可以选择定义消息选择器,这样您将只看到 JMSTimestamp
消息 header 字段值大于过去 15 分钟的消息。规范规定此 header 字段的格式必须遵循与 System.currentTimeMillis()
返回的格式相同的格式,因此您所要做的就是进行该调用并减去相当于 15 分钟的时间 (15 * 60 * 1000)
:
System.currentTimeMillis() - 900000
定义选择器。如果选择此选项,您将永远不会看到不符合选择器定义的条件的消息,这将缓解您提出的有关消息处理的一些问题。
关于向 Queue 返回消息:
您可以选择构建消费 Session
以使用 CLIENT_ACKNOWLEDGE
消息传递模型。使用这种形式的消息确认,可以从 queue 检索消息,但在客户端调用消息的 acknowledge()
方法之前不会真正认为已传递。因此,如果您不进行 acknowledge()
调用,该消息将在 queue 上对其他消费者保持可用,并且它避免了与消息重新发布、delivery-count、消息排序等相关的问题.