应用程序的简要概述
JEE应用程序在GlassFish服务器中运行,请参阅下面的系统环境详细信息,并使用在GlassFish中以嵌入模式配置的捆绑Open MQ进行内部JMS消息传递。使用消息使用者消息驱动Bean。 MDB池大小是默认值32,请参阅下面的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)
打开Message Queue 4.5.2
甲骨文
版本:4.5.2补丁1(Build 3-d)
编译:2012年6月7日星期四10:46:15
java版“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) {
...
}
...
}
答案 0 :(得分:0)
我在嵌入模式下有时会发现这个问题,我们切换到本地独立模式(启动OpennMS独立JVM),之后问题就解决了。你可以试试。
Tomz。