繁体   English   中英

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

[英]how to force DB update before sending the JMS message to next queue

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

  1. 从队列1中读取消息
  2. 将消息解组到Java对象中
  3. 将未编组的Java对象保存到数据库表中
  4. 将消息(包含来自step_3的object-id)发送到下一个队列2
  5. 阅读queue-2上的消息(并根据对象的id从数据库中加载对象)

我的问题是,在很多情况下,在第5步中,我发现数据库中还没有object-id,我抛出了异常,消息循环返回并重新尝试,最终object_id显示在数据库中并且第5步中的消息已成功处理。

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

那么为什么在很多情况下,步骤5为什么在数据库中找不到对象ID。 有什么办法可以迫使我避免或减少在第5步中收到此错误。

如果您在很多情况下说在第5步中,该对象不在db中,则很可能在进入第5步时该事务未提交。

如果您在从队列2中读取消息之前等待事务的结果,该怎么办?如果这是2个不同的进程,则可以通知另一台机器:队列1中的所有消息均已传递,并且可以继续进行处理了。从队列2中读取消息。

我一直在寻找使用weblogic容器的解决方案。 我发现此设置在weblogic控制台中称为“ 交货时间覆盖”-定义为默认延迟,即从生成消息到在目标目标上显示消息之间的默认延迟,无论由邮件发送者指定的发送时间如何。生产者和/或连接工厂

time-to-deliver-override-link我将此值设置为3-4秒,并且此问题减少了90%。

只需在此处粘贴此信息,以便其他人可以从中受益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM