顧客は次のパターンを使用します。
- ApacheCamelおよびCXFJMSレシーバー
- これらは、Spring MDP(メッセージ駆動型POJO)を内部的に使用して、メッセージレシーバーを実装します
- これらはIBMWebSphereApplicationServer7にデプロイされます
- キュー・マネージャーはIBM WebsphereMQ6です。
- Spring MDPは、JNDIキュー接続ファクトリを使用してキューマネージャにバインドされます。接続プールとセッションプールがサポートされています。
このようなメッセージ受信者の例を次に示します。これはCamelを使用しています。
<bean id="ibmmq" class="org.apache.camel.component.jms.JmsComponent">
<property name="configuration" ref="jmsConfig"/>
</bean>
<!-- JNDI reference to the queue manager -->
<jee:jndi-lookup id="myTargetConnectionFactory" jndi-name="${mq.queueconnectionfactory}"/>
<bean id="jmsDestResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"/>
<bean id="myConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="myTargetConnectionFactory"/>
<property name="username" value="SOME_USER"/>
<property name="password" value=""/>
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="${mq.connectionfactorybean}" />
<property name="destinationResolver" ref="jmsDestResolver" />
<property name="concurrentConsumers" value="1" />
<property name="maxConcurrentConsumers" value="1" />
<!--
NOTE: If we try to use a cache without a transactionManager we get "Connection closed" errors
-->
<property name="cacheLevelName" value="CACHE_NONE" />
</bean>
問題: WebSphere MQ管理者が、キュー・マネージャーに対してより多くのMGET()要求を報告しています。現時点での仮説は、これらの受信者が常にチャネルをポーリングして新しいメッセージを探しているというものです。
MDB(メッセージ駆動型Bean)ではこの問題は発生していないようです。MDP非同期実装は本当にポーリングメカニズムですか?もしそうなら、キューマネージャへのトリップを制限する方法はありますか?おそらくポーリング間隔を増やしますか?任意の洞察をいただければ幸いです。