在JMS中对邮件进行排队,以进行延迟处理

时间:2016-12-20 15:33:23

标签: java multithreading jms

我有一个位于两个JMS队列之间的中间件。从它读取的一个,将一些数据处理到数据库,然后写入另一个。

这是一个描绘设计的小图:

enter image description here

考虑到这一点,我有一些有趣的逻辑,我想整合到服务中。

  • 场景1:假设中间件服务从队列1接收消息,并命中数据库以存储该消息的部分内容。如果一切顺利,它会使用一些数据构造一条新消息,并将其写入队列2.

  • 场景2:当服务在从队列1获取消息后尝试执行某些逻辑时,假设数据库抱怨某事。在这种情况下,我不会将消息写入队列2,而是尝试在增量超时中执行数据库功能。即在5秒钟内再次尝试,然后30秒,然后再按下1分钟。当然,捕获的是能够独立于此重试读取其他消息。即重新尝试处理这一个请求,同时收听其他请求。

考虑到这一点,构建面向未来的解决方案的正确和最现代的方法是什么?

在阅读网上的一些帖子后,似乎我有几个选择。

  • 一,收到新邮件后我可以分拆一个新主题,这样我就可以执行“重试”功能并收听新请求。
  • 二,我可能会延迟将消息发送回队列。即如果进程无法在db中执行,则通过向JMS队列添加一些延迟来将消息写入JMS队列。

我更喜欢第一个解决方案,但是,如果在Java 7中有更新/更好的方法来解决这个功能,我想得到社区的意见。是否有一些内置于JMS中以支持这种解决方案“在特定时间发回消息以进行再处理”?

1 个答案:

答案 0 :(得分:0)

JMS 2.0规范描述了延迟传递消息的概念。请参阅https://java.net/projects/jms-spec/pages/JMS20FinalReleaseMany {JMS提供商已实施延迟交付功能的“新增内容”部分。

但我想知道延迟交付将如何帮助你的方案。由于数据库写入存在问题,因此后续处理和尝试写入数据库的消息可能最终处于相同的情况。我想最好解决数据库更新问题,然后从队列中拾取消息。