【问题标题】:JMS message preserve when DB down数据库关闭时保留 JMS 消息
【发布时间】: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


    【解决方案1】:

    我不熟悉 Web Logic,但以我对 IBM MQ 的了解来回答。

    您是否考虑过为应用程序接收消息的队列设置Redelivery LimitError Destination 属性?如果消息的JMSXDeliveryCount 属性超过Redelivery Limit,则该消息将被路由到Error Destination,基本上是队列或主题。您还可以为消息设置Redelivery Delay Override 属性。

    您可以编写单独的逻辑来将消息从Error Destination 移动到应用程序从中接收消息的队列。这样消息就不会丢失。

    更多详情here.

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      容器管理事务——不是通过代码处理线程/消息重试,而是容器将处理它。

      容器将根据下面提到的 MDB 配置重试消息。

      即weblogic-ejb-jar.xml下:message-driven-descriptor

              <init-suspend-seconds>2</init-suspend-seconds> 
      

      以 2 秒重试开始。每次重试间隔秒数加倍,直到达到最大重试 300 秒。即 2、4、8 … 300

              <max-suspend-seconds>300</max-suspend-seconds> 
      

      一旦达到 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>
      

      【讨论】:

        猜你喜欢
        • 2019-07-15
        • 2013-03-23
        • 2023-03-04
        • 2016-05-08
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 2017-10-17
        相关资源
        最近更新 更多