長期間有効なJMSセッション。 JMS接続/ JMSセッションの維持は常に悪い習慣ですか?
質問
JMS接続/セッション/コンシューマーは常に悪い習慣を続けていますか?
コード草案の例:
// app startup code
ConnectionFactory cf = (ConnectionFactory)jndiContext.lookup(CF_JNDI_NAME);
Connection connection = cf.createConnection(user,pass);
Session session = connection.createSession(true,Session.TRANSACTIONAL);
MessageConsumer consumer = session.createConsumer(new Queue(queueName));
consumer.setMessageListener(new MyListener());
connection.start();
connection.setExceptionListener(new MyExceptionHandler()); // handle connection error
// ... Message are processed on MyListener asynchronously ...
// app shutdown code
consumer.close();
session.close();
connection.close();
このJMSの使用パターンを改善するための提案はありますか?
解決
これは、長期間存続する接続を処理する場合に非常に一般的で受け入れられる方法です。多くのJMSサーバーでは、実際には、必要になるたびに新しい接続を作成することをお勧めします。
他のヒント
同意しました。以下に、 JMSを効率的に使用するための優れたヒントを示します。接続/セッション/プロデューサー/コンシューマーを維持することも含まれます。
トランザクションの使用に関する推奨事項も確認することもできます。パフォーマンスの最大化に関心がある場合。
接続/セッション/プロデューサー/コンシューマーを長時間開いたままにするかどうかは、プロデューサー/コンシューマーがメッセージを送受信する頻度に基づいて選択する必要があります。
プロデューサーが頻繁にメッセージを送信するか、コンシューマーがメッセージを受信する場合、接続/セッション/プロデューサー/消費者は開いたままにしておく必要があります。一方、メッセージの送受信がまれな場合、これらのJMSオブジェクトを開いたままにしておくと、ソケットなどのシステムリソースが消費されます。
このアプリでは、接続/セッション/消費者/プロデューサーを一度に数か月間開いています。確実に機能させるには、ベンダー(BEA)と協力する必要がありました。しかし、それに関するトラブルはベンダーが修正する必要があるバグです。
FYI、閉じた接続のセッション、プロデューサー、およびコンシューマーを閉じる必要はありません( javax.jms.Connection )。 リソースを解放するには、次のコードで十分です。
try {
this.connection.close();
} catch (JMSException e) {
//
}