14.3. クライアント側 JMS パフォーマンスの最適化
概要
2 つの主要な設定がクライアントの JMS パフォーマンスに影響します。プーリングと同期受信です。
プーリング
クライアント側で、CXF はメッセージごとに新しい JMS セッションおよび JMS プロデューサーを作成します。これは、session および producer オブジェクトがスレッドセーフであるためです。プロデューサーの作成には、サーバーと通信する必要があるため、特に時間がかかります。
接続ファクトリーのプールは、接続、セッション、およびプロデューサーをキャッシュすることでパフォーマンスを向上します。
ActiveMQ の場合は、プーリングの設定が簡単です。以下に例を示します。
import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.pool.PooledConnectionFactory; ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); PooledConnectionFactory pcf = new PooledConnectionFactory(); //Set expiry timeout because the default (0) prevents reconnection on failure pcf.setExpiryTimeout(5000); pcf.setConnectionFactory(cf); JMSConfiguration jmsConfig = new JMSConfiguration(); jmsConfig.setConnectionFactory(pdf);
プーリングの詳細は、Red Hat JBoss Fuse トランザクションガイド の "付録 A JMS シングルおよびマルチリソーストランザクションのパフォーマンスの最適化" を参照してください。
同期受信の回避
要求/応答交換の場合、JMS トランスポートは要求を送信してから応答を待ちます。可能な場合は、JMS MessageListener
を使用してリクエスト/リプライメッセージングが非同期に実装されます。
ただし、エンドポイント間でキューを共有する必要がある場合は、CXF は同期 Consumer.receive()
メソッドを使用する必要があります。このシナリオでは、MessageListener
がメッセージセレクターを使用してメッセージをフィルターする必要があります。メッセージセレクターは事前に認識される必要があるため、MessageListener
は一度だけ開かれます。
メッセージセレクターを事前に知ることができない 2 つのケースは避ける必要があります。
JMSMessageID
がJMSCorrelationID
として使用される場合JMS プロパティーが
useConduitIdSelector
およびconduitSelectorPrefix
が JMS トランスポートに設定されていない場合、クライアントはJMSCorrelationId
を設定しません。これにより、サーバーはJMSCorrelationId
としてリクエストメッセージのJMSMessageId
を使用します。JMSMessageID
は事前に認識できないため、クライアントは同期Consumer.receive()
メソッドを使用する必要があります。IBM JMS エンドポイントで
Consumer.receive()
メソッドを使用する必要があることに注意してください (デフォルト)。ユーザーはリクエストメッセージに
JMStype
を設定し、カスタムJMSCorrelationID
を設定します。ここでも、カスタムの
JMSCorrelationID
は事前に認識できないため、クライアントは同期Consumer.receive()
メソッドを使用する必要があります。
したがって、一般的なルールは、同期受信の使用を必要とする設定の使用を避けることです。