2

应用程序简要概述

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 PDT

  • 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) {
        ...
    }
    ...
}
4

1 回答 1

0

我在embed模式下发现这个问题,我们切换到本地独立模式(启动OpenMQ单独的JVM),之后问题就解决了。你可以试试。

汤姆兹。

于 2015-01-13T10:00:31.903 回答