Open MQ中的奇怪现象:在将它们传递给MDB之前,意外的消息开始卡在JMS队列中一段时间

时间:2014-05-21 14:45:57

标签: java glassfish jms openmq

应用程序的简要概述

JEE应用程序在GlassFish服务器中运行,请参阅下面的系统环境详细信息,并使用在GlassFish中以嵌入模式配置的捆绑Open MQ进行内部JMS消息传递。使用消息使用者消息驱动Bean。 MDB池大小是默认值32,请参阅下面的JMS配置和MDB类详细信息。

应用程序可分为两个主要部分,功能大致如下:

  • 外部系统适配器侦听来自各种外部系统的旧消息,并将它们作为JMS消息发送到核心应用程序。
  • 核心应用程序处理收到的JMS消息。 MDB在这里运行。

问题描述

从适配器到核心的消息传递通常只需几秒钟即可顺利完成。但是由于未知原因,有时以下情况会永久发生:适配器发送的消息会在JMS队列中停留一分钟,然后才会传递给MDB。使用Open MQ监视命令:imqcmd metrics dst -t q -n CacheQueueDestimqcmd 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) {
        ...
    }
    ...
}

1 个答案:

答案 0 :(得分:0)

我在嵌入模式下有时会发现这个问题,我们切换到本地独立模式(启动OpennMS独立JVM),之后问题就解决了。你可以试试。

Tomz。