有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java计划重试关联的JMS消息

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

有一条消息a和相关的消息B跟随它并引用它。在一些奇怪的情况下,B在A之前到达。在这种情况下,在一些“x”等间隔后必须进行3次重试,以查看A是否到达,然后继续关联

由于消息侦听器是单线程的,如果我们将线程置于睡眠状态,整个系统将受到影响。因此,必须有一个单独的线程重试

为此,我们是否可以使用Quartz作业调度器来避免处理多线程问题,并通过以下两种方式之一永久存储

  1. 在Quartz中计划一个作业3次,并跟踪JobDataMap中的标志,以检查以前的重试是否成功,然后返回,不做任何操作

二,。安排作业重试一次,如果重试失败,请在几秒钟后安排相同的作业

quartz只能用于重复性作业,并且在整个作业中没有一些状态信息,或者是否有其他更好的方法可以做到这一点


共 (1) 个答案

  1. # 1 楼答案

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

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

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