Java 数据库关闭时保留JMS消息 应用程序概述:
在我的应用程序中,我们每天接收60000条消息。它使用11 MDB和MessageListener订阅来自不同OMB队列的消息并对其进行处理。使用WebLogicServer和JAP。每个MDB总共有32个实例,因为我们有8个不同的节点,每个节点在空闲池中的最大bean是4 当前问题: 当数据库关闭时,在异常中捕获它并回滚事务上下文,以便将消息放回队列。我们正在检查JMSXDeliveryCount是否小于100,它将重试,否则它将删除邮件并发送带有邮件引用的电子邮件 问题: 消息丢失,几秒钟内重试100次到达。但2小时后DB可能会上升 拟议办法: 在处理消息之前检查数据库连接,如果数据库连接出现问题–在重新调用后让线程休眠5分钟以检查连接。 在这种情况下,每个MDB可以在应用程序级保存32条消息(Tread),其余消息将在队列中。我们有11个MDB,所以(11*32)个线程可能会在应用程序级别休眠 我觉得在初始级别检查所有消息的DB连接并在应用程序级别保持352消息(控制352线程,可能是weblogic崩溃)直到DB启动是不好的Java 数据库关闭时保留JMS消息 应用程序概述:,java,multithreading,ejb,jms,weblogic,Java,Multithreading,Ejb,Jms,Weblogic,在我的应用程序中,我们每天接收60000条消息。它使用11 MDB和MessageListener订阅来自不同OMB队列的消息并对其进行处理。使用WebLogicServer和JAP。每个MDB总共有32个实例,因为我们有8个不同的节点,每个节点在空闲池中的最大bean是4 当前问题: 当数据库关闭时,在异常中捕获它并回滚事务上下文,以便将消息放回队列。我们正在检查JMSXDeliveryCount是否小于100,它将重试,否则它将删除邮件并发送带有邮件引用的电子邮件 问题: 消息丢失,几秒钟内
在MDB级别或weblogic级别,有没有更好的方法来处理这个问题?我不熟悉Web逻辑,但用我在IBM MQ方面的知识来回答 您是否查看过为应用程序接收消息的队列设置
重新交付限制
和错误目标
属性?如果消息的JMSXDeliveryCount
属性超过重新交付限制
,则该消息将被路由到错误目标
,基本上是一个队列或主题。您还可以为消息设置重新交付延迟覆盖
属性
您可以编写单独的逻辑,将消息从错误目标
移动到应用程序接收消息的队列。这样信息就不会丢失
更多细节
希望这有帮助。容器管理的事务–容器将处理它,而不是通过代码处理线程/消息重试 容器将根据下面提到的MDB配置重试该消息 i、 weblogic-ejb-jar.xml下的e:消息驱动描述符
<init-suspend-seconds>2</init-suspend-seconds>
2
从2秒开始重试。重试间隔时间每次加倍,直到达到300秒的最大重试时间。i、 E2,4,8…300
<max-suspend-seconds>300</max-suspend-seconds>
300
一旦达到300秒,容器将每300秒重试一次,直到故障原因得到解决。问题解决后,容器将恢复MDB实例的正常处理
<message-driven-descriptor>
<pool>
<max-beans-in-free-pool>4</max-beans-in-free-pool>
<initial-beans-in-free-pool>1</initial-beans-in-free-pool>
</pool>
<destination-jndi-name>XXX_FOREIGN_DEST_LOCAL@env_name@
</destination-jndi-name>
<connection-factory-jndi-name>XXX_FOREIGN_QCF_LOCAL@env_name@
</connection-factory-jndi-name>
<init-suspend-seconds>2</init-suspend-seconds>
<max-suspend-seconds>300</max-suspend-seconds>
</message-driven-descriptor>
4.
1.
XXX\u外国目的地_LOCAL@env_name@
XXX_外国_QCF_LOCAL@env_name@
2.
300