Java 如何在将JMS消息发送到下一个队列之前强制DB更新

Java 如何在将JMS消息发送到下一个队列之前强制DB更新,java,ejb,jms,messaging,xa,Java,Ejb,Jms,Messaging,Xa,我在WebLogic11g容器上的JavaJMS配置中有一个简单的用例(使用Spring3.x框架进行依赖项注入,使用EJB2.x进行MDB和EJBjar.xml中的声明性事务管理) 从队列1读取消息 将消息解组为java对象 将取消编组的java对象保存到数据库表中 将消息(包含步骤3中的对象id)发送到下一个队列2 读取队列2上的消息(并根据对象id从数据库加载对象) 我的问题是在很多情况下,在步骤5中,我发现数据库中还不存在对象id,我抛出异常,返回消息循环并重试,最终对象id显示在数据库

我在WebLogic11g容器上的JavaJMS配置中有一个简单的用例(使用Spring3.x框架进行依赖项注入,使用EJB2.x进行MDB和EJBjar.xml中的声明性事务管理)

  • 从队列1读取消息
  • 将消息解组为java对象
  • 将取消编组的java对象保存到数据库表中
  • 将消息(包含步骤3中的对象id)发送到下一个队列2
  • 读取队列2上的消息(并根据对象id从数据库加载对象)
  • 我的问题是在很多情况下,在步骤5中,我发现数据库中还不存在对象id,我抛出异常,返回消息循环并重试,最终对象id显示在数据库中,步骤5中的消息得到成功处理

    涵盖步骤1-4(在MDB中实现)的工作流在ejb-jar.xml中按照“需要”进行事务划分,并且连接工厂启用了XA。这意味着工作流(步骤1-4)必须在事务中运行,该事务在消息最终在步骤4发送到队列2时提交

    那么为什么步骤5在很多情况下都没有在数据库中找到对象id呢。
    是否有任何方法可以强制执行此操作,以避免或减少在步骤5中获取此错误。

    如果您说在很多情况下,在步骤5中,对象不在数据库中,则很可能在到达步骤5时事务没有提交


    如果在读取队列2中的消息之前等待事务的结果,该怎么办。如果这是两个不同的进程,您可以通知另一台机器,队列1中的所有消息都已传递,并且它可以通过读取队列2中的消息来继续操作。

    我正在寻找使用weblogic容器的解决方案。我在weblogic控制台中找到了名为“交付时间覆盖”的设置,该设置定义为 默认延迟,从消息生成到消息在其目标目标上可见,与生产者和/或连接工厂指定的传递时间无关

    我将该值设置为3-4秒,使问题减少了90%


    只需将此信息粘贴到此处,以便其他寻找此问题的人可以从中受益

    我可能会将步骤3上的消息保存在子事务中,该子事务在运行步骤4之前提交,但这会破坏步骤1-4的事务原子性,这就是我不想使用该解决方案的原因。请检查此项。谢谢那是一只公牛的眼睛。。明天将尝试并在此处更新..再想一想,这实际上迫使工作流序列化。。如果有多个事件试图更新第二个工作流中的同一行。。通过大幅降低系统的吞吐量,我们基本上阻止了它们逐一进入。。因为这个原因,它对我们不起作用。。目前我仍在寻找其他可用的选项。。