1

我有一个单线程消息侦听器来侦听传入的消息。收到的消息在收到时会保存在数据库中。

有一条消息 A 和关联的消息 B 跟在它后面,并带有一个引用 it。在一些奇怪的情况下,B 在 A 之前到达。现在在这种情况下,必须在一些 'x' 相等的时间间隔之后进行 3 次重试,以查看 A 是否已经到达并且然后保持关联。

由于消息监听器是单线程的,如果我们让线程休眠,整个系统都会受到影响。所以必须有一个单独的线程重试。

我们是否可以为此目的使用 Quartz Job Scheduler 来避免处理多线程问题并以以下两种方式中的任何一种方式拥有 PERSISTENT STORE,

  1. 在 Quartz 中调度一个 Job 3 次,并跟踪 JobDataMap 中的一个标志,以检查之前的重试是否成功,然后什么都不做就返回

或者

2.安排一个作业重试一次,如果重试失败,几秒钟后安排相同的作业。

石英能否仅用于重复性工作,并且没有跨工作的一些状态信息,或者有没有其他更好的方法来做到这一点。

4

1 回答 1

0

您应该配置您的 JMS 提供程序以在您的消息队列上设置重新传递延迟。在您的代码中,您调用context.setRollbackOnly以中止未通过先决条件检查的消息。

在这种情况下,代码执行场景变为:

  • 消耗“B”,检查先决条件并检测缺少 A
  • 回滚事务,消息返回队列,配置延迟后重新投递
  • 消费并处理下一条消息“A”
  • 延迟后,MDB 再次成功消费并处理“B”
于 2012-01-27T13:45:49.787 回答