Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库关闭时保留JMS消息 应用程序概述:_Java_Multithreading_Ejb_Jms_Weblogic - Fatal编程技术网

Java 数据库关闭时保留JMS消息 应用程序概述:

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,它将重试,否则它将删除邮件并发送带有邮件引用的电子邮件 问题: 消息丢失,几秒钟内

在我的应用程序中,我们每天接收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启动是不好的


在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