如何在将JMS消息发送到下一个队列之前强制进行数据库更新

时间:2015-07-03 21:12:30

标签: java ejb jms messaging xa

我在Weblogic 11g容器上的Java JMS配置中有一个简单的用例(使用Spring 3.x框架进行依赖注入,使用EJB 2.x进行MDB和ejb-jar.xml中的声明式事务管理)。

  1. 从队列-1中读取消息
  2. 将邮件解组为java对象
  3. 将unmarshalled java对象保存到数据库表中
  4. 将消息(包含来自step_3的object-id)发送到下一个queue-2
  5. 读取队列2上的消息(并根据其对象ID从数据库加载对象)
  6. 我的问题在很多情况下,在第5步,我发现对象id还没有存在于数据库中,我抛出异常,消息循环返回并重新尝试,最终是object_id显示在数据库中,步骤5中的消息成功处理。

    覆盖步骤1-4的工作流程(在MDB中实施)具有以" REQUIRED"完成的交易分界。在ejb-jar.xml中,连接工厂已启用XA。这意味着工作流(步骤1-4)必须在最后在步骤4中将消息发送到队列2时提交的事务中运行。

    那么为什么step-5在很多情况下都没有在数据库中找到object-id。 有什么方法可以强制这样做以避免或减少在第5步中出现此错误。

2 个答案:

答案 0 :(得分:1)

如果你说在很多情况下,在第5步,对象不在db中,很可能在你到达第5步时没有提交事务。

如果在从队列2中读取消息之前等待事务的结果,如果这些是2个不同的进程,则可以通知另一台计算机队列1中的所有消息都已交付并且已准备好继续阅读队列2中的消息。

答案 1 :(得分:-1)

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

time-to-deliver-override-link 我把这个值设置为3-4秒,这个问题减少了90%。

这里只是粘贴这些信息,以便其他寻找此问题的人可以从中受益。