1

顧客は次のパターンを使用します。

  • 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非同期実装は本当にポーリングメカニズムですか?もしそうなら、キューマネージャへのトリップを制限する方法はありますか?おそらくポーリング間隔を増やしますか?任意の洞察をいただければ幸いです。

4

2 に答える 2

2

CXFについてはよくわかりませんが、Camelリスナーの場合:

JmsConfigurationのデフォルトのJMSコンシューマーは「デフォルト」タイプのようです。つまり、SpringのDefaultMessageListenerContainerを実装します。

Javadocから

プレーンなJMSクライアントAPI、具体的にはMessageConsumer.receive()呼び出しのループを使用するメッセージリスナーコンテナバリアント

受信呼び出しは、MQGET呼び出しにマップされます。

シンプルタイプのコンシューマーを指定するオプションもあります。これはあなたが望むものだと思います。

プレーンJMSクライアントAPIのMessageConsumer.setMessageListener()を使用するメッセージリスナーコンテナ

ここではわかりませんが、Springのドキュメントには、単純なメッセージリスナーコンテナがXAトランザクションをサポートしていないことが示されています。アプリケーションサーバー内で実行しているので、これは考慮すべきことかもしれません。

于 2013-01-18T12:28:18.807 に答える
0

メインフレームQでも同様の問題が発生しました。IBMメインフレームq:

アプリケーション・プロセスIDは、キュー・マネージャーに渡されるデフォルトのユーザーIDとして使用されることに注意してください。アプリケーションがクライアントトランスポートモードで実行されている場合、このプロセスIDは、サーバーマシン上の関連する認証とともに存在する必要があります。別のIDが必要な場合、アプリケーションはcreateConnection(username、password)メソッドを使用する必要があります。

つまり、適切な資格情報を送信しない限り、IBMはJVMプロセスIDを使用してmqにログインします。Springを使用していたため、DefaultMessageListenerContainerがQをポーリングするたびに、クレデンシャルを送信する必要がありました。私はこれらの赤ちゃんの1人とバムをつなぎ、魅力のように働きました:

public class CustomConnectionFactory extends CachingConnectionFactory {

    private String username;
    private String password;

    ...

    /**
     * This is the secret sauce. Each time when we make a connection, we send
     * the username/password.
     */
    protected Connection doCreateConnection() throws JMSException {
        return getTargetConnectionFactory().createConnection(this.username, this.password);
    }

私たちのメインフレーマーはもっと幸せでした。その後、分散MQに切り替えましたが、すべてがはるかに優れていました。

最終的な設定は次のとおりです。

<!-- This hooks us up to the jndi -->
<jee:jndi-lookup id="telematicsJNDIConnectionFactory" jndi-name="${mq.jndi}" cache="true" lookup-on-startup="true" />
<!-- The outer wrapper must be TransactionAware, the inner custom one will cache the connection -->
<bean id="telematicsConnectionFactory" class="org.springframework.jms.connection.TransactionAwareConnectionFactoryProxy">
    <property name="targetConnectionFactory">
        <bean class="cat.dds.tmatic.utils.CustomConnectionFactory">
            <property name="targetConnectionFactory">
                <ref bean="telematicsJNDIConnectionFactory" />
            </property>
            <property name="username">
                <value>${mq.user}</value>
            </property>
            <property name="password">
                <value>${mq.pass}</value>
            </property>
            <property name="sessionCacheSize">
                <value>10</value>
            </property>
        </bean>
    </property>
    <property name="synchedLocalTransactionAllowed" value="true" />
</bean>
于 2013-02-08T20:52:23.100 に答える