【问题标题】:Scheduled Retrying for an associated JMS Message关联 JMS 消息的计划重试
【发布时间】:2010-09-23 21:44:57
【问题描述】:

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

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

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

我们可以为此目的使用 Quartz Job Scheduler 来避免处理多线程问题并通过以下 2 种方式中的任何一种方式进行 PERSISTENT STORE,

  1. 在 Quartz 中安排一个 Job 3 次,并跟踪 JobDataMap 中的一个标志,以检查之前的重试是否成功,然后不做任何事情就返回

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

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

【问题讨论】:

    标签: java jakarta-ee jobs quartz-scheduler


    【解决方案1】:

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

    这样的话,代码执行场景就变成了:

    • 使用“B”,检查先决条件并检测 A 是否缺失
    • 回滚事务,消息返回队列,配置延迟后重新投递
    • 使用并处理下一条消息“A”
    • 延迟后,MDB 再次成功消费并处理“B”

    【讨论】:

    • 我们实现了一个基于石英调度器的解决方案,但没有考虑到这一点。这本来是一种更好的方法,因此将其标记为答案
    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2013-03-23
    • 2020-08-17
    • 2016-07-26
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多