2017-02-28 4 views
1

Iは、z/OSキューにリモートのWebSphere MQ 6.1アプリケーションサーバAS のWebSphere上で稼働するWebアプリケーションから接続する必要があります。 WebSphere ASでは、QueueConnectionFactoryとQueue(リモート・キュー・データの一部を含むオブジェクト)の両方を構成し、ほとんどの設定をデフォルト値に設定しました。キュー名、チャネル、ホスト、ポート、およびトランスポートを設定するだけでしたタイプはCLIENTです。は、「接続が閉じて、」スロー繰り返し

<jee:jndi-lookup id="destination" jndi-name="MyMQQueue" expected-type="javax.jms.Queue" /> 

    <jee:jndi-lookup id="targetConnectionFactory" jndi-name="MyMQQCF" expected-type="javax.jms.QueueConnectionFactory" /> 

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate" 
     p:connectionFactory-ref="targetConnectionFactory" 
     p:defaultDestination-ref="destination" /> 

    <bean id="simpleMessageListener" class="my.own.SimpleMessageListener"/> 

    <bean id="msgListenerContainer" 
     class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="targetConnectionFactory" /> 
     <property name="destination" ref="destination" /> 
     <property name="messageListener" ref="simpleMessageListener" /> 
     <property name="taskExecutor" ref="managedThreadsTaskExecutor" /> 
     <property name="receiveTimeout" value="5000" /> 
     <property name="recoveryInterval" value="5000" /> 
    </bean> 

    <bean id="managedThreadsTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"> 
     <property name="workManagerName" value="wm/default" /> 
    </bean> 

JmsTemplateが正しく(同期)メッセージを送信し、受信した:私は、JNDIルックアップを使用して、次の春3.2設定でそれらを注入します。非同期メッセージ受信者のDefaultMessageListenerContainerは、WebSphere ASの開始時にMQキューからいくつかの(以前に送信された)メッセージを読み取りますが、すぐ後に詰まり、 "接続が閉じられました"という例外を繰り返しスローし始めます。そのような機会に、それは私に通知することを通知します。

DefaultMessag W org.springframework.jms.listener.DefaultMessageListenerContainer handleListenerSetupFailure Setup of JMS message listener invoker failed for destination 'queue://myqueue' - trying to recover. Cause: Connection closed 
DefaultMessag I org.springframework.jms.listener.DefaultMessageListenerContainer refreshConnectionUntilSuccessful Successfully refreshed JMS Connection 

しかし、キューからメッセージを取るのをやめます。春のコードにビットを掘る

は、私がDefaultMessageListenerContainer

<property name="cacheLevel" value="0"/> 

に設定すると、メッセージは、今、私はそれらを送信するたびにキューをオフに読まれているという意味で、問題を解決することを発見しました。

Wireshark captured traffic

おそらく接続が継続的に閉じられ、再び開かされることを意味している。ただし、WebSphere MQへのTCPトラフィックを見て私はMQCLOSE/MQOPENコマンドはのように繰り返し、それに送信されていることがわかります。

キャッシングの原因が何であるかをお勧めします。Springコードを変更する(たとえばDefaultMessageListenerContainerを拡張する)比較的簡単な方法があるか、おそらくMQキュー接続ファクトリ/キュー、それを動作させるには?

EDIT:

はさらに、インターネットの検索、私は、Tomcat上で発生する同様の問題を記述しているようだ次のリンク

http://forum.spring.io/forum/spring-projects/integration/jms/89532-defaultmessagelistenercontainer-cachingconnectionfactory-tomcat-and-websphere-mq

を発見しました。解決策は、DefaultMessageListenerContainerに特定のexceptionListenerを設定することです。しかし、WebSphereでこれを実行しようとすると、例外 "javax.jms.IllegalStateException:Method setExceptionListener not permitted"がスローされます。根本的な原因は、J2EE 1.4仕様でJMS接続でsetExceptionListenerを呼び出すことを禁じているようです。

https://www.ibm.com/developerworks/library/j-getmess/j-getmess-pdf.pdf

答えて

1

DefaultMessageListenerContainer上

<property name="cacheLevel" value="0"/> 

を設定すると、実際に正しい解決策であると思われます。

私はMQCLOSE/MQOPENを解釈して自分自身を誤解しています。この場合、WiresharkがTCPトラフィックをキャプチャしたのは、重量のある接続の開口部です。

最初に、管理コンソールWebSphere AS 6.1上に新しく作成された接続ファクトリーには、デフォルトでJMS接続プール(最大サイズ10)があります。 DefaultMessageListenerContainer、AbstractPollingMessageListenerContainerの基底クラス、(特にメソッド

protected boolean doReceiveAndExecute(
      Object invoker, Session session, MessageConsumer consumer, TransactionStatus status) 

)をデバッグすることにより

1は、コールどちらもTCPトラフィックを生成接続からセッションを作成するにはどちらも、呼び出しを接続を作成しないようにすることを見てTCPトラフィックは、消費者(私が正しく理解すれば「軽量操作」とみなされる)を作成し、キューからメッセージを受信しようとし、消費者を閉じることによってのみ生成されます。

したがって、接続はそれぞれのプールから行われ、セッションは何らかの形で「キャッシュされている」ようです。

したがって、Springによるキャッシングの代わりに、アプリケーションサーバーによってキャッシングが行われているように見えます。

関連する問題