应用程序简要概述
JEE 应用程序在 GlassFish 服务器中运行,请参阅下面的系统环境详细信息,并使用 GlassFish 中以嵌入式模式配置的捆绑 Open MQ 进行内部 JMS 消息传递。作为消息消费者,使用消息驱动 Bean。MDB 池大小默认为 32,请参阅下面的 JMS 配置和 MDB 类详细信息。
该应用程序可以分为两个主要部分,功能大致如下:
- 外部系统适配器侦听来自各种外部系统的遗留消息,并将它们作为 JMS 消息发送到核心应用程序。
- 核心应用程序处理接收到的 JMS 消息。MDB 在这里运行。
问题描述
从适配器到核心的消息传递通常只需几秒钟即可顺利进行。但是,由于未知原因,有时会永久发生以下情况:适配器发送的消息在 JMS 队列中停留了一分钟,然后才传递给 MDB。使用 Open MQ 监控命令:imqcmd metrics dst -t q -n CacheQueueDest
或者imqcmd query dst -t q -n CacheQueueDest
我们可以看到发送的消息在队列中,并且仅在一分钟内调用 MDB 的 onMessage 方法。当这种错误情况发生时,即使一条消息也会卡在队列中,因此问题将独立于系统负载而存在。
我为 Open MQ 设置了 DEBUGHIGH 日志级别,但在日志中没有发现任何内容。我已将 Open MQ 配置为本地(在自己的进程中而不是在 GlassFish 进程中运行)并设置数据包级别日志记录,但同样没有发现任何内容。
摆脱这种错误状态的唯一方法是重新启动 GlassFish 服务器。
我将不胜感激任何解决此问题的想法。
系统环境:
SunOS 5.10 Generic_150401-05 i86pc i386 i86pc
GlassFish Server 开源版 3.1.2.2(内部版本 5)
打开消息队列 4.5.2
Oracle
版本:4.5.2 补丁 1(构建 3-d)
编译:2012 年 6 月 7 日星期四 10:46:15 PDTjava 版本“1.7.0_25”
Java(TM) SE 运行时环境(构建 1.7.0_25-b34)
Java HotSpot(TM) 64 位服务器 VM(构建 23.25-b03,混合模式)
来自 domain.xml 的 JMS 配置:
<resources>
<admin-object-resource
res-adapter="jmsra"
res-type="javax.jms.Queue"
jndi-name="jms/cacheQueue">
<property name="Name" value="CacheQueueDest"></property>
</admin-object-resource>
<connector-connection-pool
name="jms/cacheConnFactory"
resource-adapter-name="jmsra"
is-connection-validation-required="true"
connection-definition-name="javax.jms.QueueConnectionFactory"
max-wait-time-in-millis="6000"
fail-all-connections="true"
transaction-support="NoTransaction"/>
</resources>
<configs>
<config name="server-config">
<mdb-container/>
<jms-service default-jms-host="default_JMS_host">
<jms-host port="59900" host="localhost" name="default_JMS_host"></jms-host>
</jms-service>
</config>
</configs>
MDB 类:
...
import javax.jms.Message;
import javax.jms.MessageListener;
...
@MessageDriven(mappedName = "jms/cacheQueue", messageListenerInterface = javax.jms.MessageListener.class)
public class CacheChange implements MessageListener {
...
@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
@Override
public void onMessage(final Message message) {
...
}
...
}