アプリケーションの概要
JEE アプリケーションは GlassFish サーバーで実行されます。以下のシステム環境の詳細を参照し、GlassFish の組み込みモードで構成されたバンドルされた Open MQ を内部 JMS メッセージングに使用します。メッセージ コンシューマとして Message Driven Bean を使用します。MDB プール サイズはデフォルトの 32 です。以下の JMS 設定と MDB クラスの詳細を参照してください。
アプリケーションは、大まかに次のように 2 つの主要な部分と機能に分けることができます。
- 外部システム アダプタは、さまざまな外部システムからのレガシー メッセージをリッスンし、それらを JMS メッセージとしてコア アプリケーションに送信します。
- コア アプリケーションは、受信した JMS メッセージを処理します。MDB はここで実行されます。
問題の説明
アダプターからコアへのメッセージ配信は通常、数秒でスムーズに行われます。ただし、不明な理由により、次のような状況が永続的に発生する場合があります。アダプタによって送信されたメッセージが JMS キューで 1 分間滞留し、その後 MDB に渡されます。Open MQ 監視コマンドを使用する:imqcmd metrics dst -t q -n CacheQueueDest
またはimqcmd query dst -t q -n CacheQueueDest
、送信されたメッセージがキューにあり、1 分後に MDB の onMessage メソッドが呼び出されることを確認できます。この障害のある状況が発生すると、メッセージが 1 つでもキューにスタックするため、システムの負荷とは無関係に問題が発生します。
Open MQ の DEBUGHIGH ログ レベルを設定しましたが、ログに何も見つかりませんでした。Open MQ をローカル (GlassFish プロセス内ではなく独自のプロセスで実行) として構成し、パケット レベルのログを設定しましたが、同様に何も見つかりませんでした。
この障害状態を解消する唯一の方法は、GlassFish サーバーを再起動することです。
この問題を解決するためのアイデアをいただければ幸いです。
システム環境:
SunOS 5.10 Generic_150401-05 i86pc i386 i86pc
GlassFish サーバー オープン ソース版 3.1.2.2 (ビルド 5)
Message Queue 4.5.2 を開く
Oracle
バージョン: 4.5.2 パッチ 1 (ビルド 3-d)
コンパイル: Thu Jun 7 10:46:15 PDT 2012Java バージョン "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) {
...
}
...
}