【发布时间】:2017-07-25 22:02:35
【问题描述】:
应用概述:
在我的应用程序中,我们每天接收 60000 条消息。它使用 11 个 MDB 和 MessageListener 来订阅来自不同 OMB 队列的消息并进行处理。使用 weblogic 服务器和 JAP。每个 MDB 总共有 32 个实例,因为我们有 8 个不同的节点,每个节点的 max-beans-in-free-pool 为 4。
当前问题:
当数据库关闭时,在异常中捕获它并回滚事务上下文,以便消息将放回队列。我们检查 JMSXDeliveryCount 是否小于 100 它将重试,否则它将丢弃消息并发送带有消息参考的电子邮件。
问题: 消息正在丢失,100 次重试在几秒钟内达到。但 DB 可能会在 2 小时后启动。
建议的方法:
在处理消息之前检查数据库连接,如果数据库连接问题 - 在重新轮询后将线程休眠 5 分钟以检查连接。 在这种情况下,每个 MDB 可以在应用程序级别保存 32 条消息(Tread),剩余的消息将在队列中。我们有 11 个 MDB,因此 (11*32) 线程可能会在应用程序级别处于休眠状态。
我觉得在初始级别检查所有消息的 DB 连接并在应用程序级别保持 352 消息(控制 352 线程,可能发生 weblogic 崩溃)直到 DB 启动,这很糟糕。
在 MDB 级别或 weblogic 级别有什么更好的方法来处理这个问题?
【问题讨论】:
标签: java multithreading ejb jms weblogic