簡體   English   中英

Open MQ中的奇怪現象:在將消息傳遞到MDB之前,消息意外地開始卡在JMS隊列中一段時間

[英]Strange phenomenon in Open MQ: unexpectedly messages start to get stuck in the JMS Queue for a while before delivering them to the MDB

應用程序簡要概述

JEE應用程序在GlassFish服務器中運行,請參閱下面的系統環境詳細信息,並將在GlassFish中以嵌入式模式配置的捆綁Open MQ用於內部JMS消息傳遞。 作為消息使用者,使用消息驅動Bean。 MDB池大小默認為32,請參見下面的JMS配置和MDB類詳細信息。

該應用程序可以分為兩個主要部分,其功能大致如下:

  • 外部系統適配器偵聽來自各種外部系統的舊消息,並將它們作為JMS消息發送到核心應用程序。
  • 核心應用程序處理收到的JMS消息。 MDB在這里運行。

問題描述

從適配器到核心的消息傳遞通常僅需幾秒鍾即可順利進行。 但是,由於未知原因,有時會永久發生以下情況:適配器發送的消息在JMS隊列中停留了一分鍾,然后才傳遞到MDB。 使用Open MQ監視命令: imqcmd metrics dst -tq -n CacheQueueDestimqcmd query dst -tq -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(版本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) {
        ...
    }
    ...
}

我有時在嵌入模式下發現了此問題,此問題解決后,我們切換到本地獨立模式(啟動OpenMQ單獨的JVM)。 你可以試試。

湯姆斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM