1

私は古いアプリケーションに取り組んでおり、その JMS システムを JBoss Messaging から HornetQ にアップグレードしています。その過程で、このアプリケーションが JMS 接続を使用および管理する方法に関連していると思われる問題に遭遇しました。これは JMS への初めての大規模な露出 (単純なおもちゃの使用法を除く) であり、現在のイディオムが正しいのか、ばかげているのか、それとも完全に間違っているのか疑問に思っています。

これが現在のシステムの仕組みです。

static QueueConnection connection;
static boolean isConnected;

static void sendSomeMessage(Object sendMe) {
   if(!isConnected) connect();

}

static void connect() {
    // jndi lookup for connection factory
    connection = factory.createQueueConnection();

    // lambdas in java pseudo code, woot!
    connection.onException => disconnect();
    connection.start();
    isConnected = true;
}

static void disconnect() {
    connection.close()
    isConnected = false;
}

これの要点は、エラーが発生するまで、送信されるすべてのメッセージに対して接続が何度も使用され、エラーが発生すると、接続が最終的に閉じられて再作成されることです。

私が見たすべての例は、すべてのメッセージに対して常に新しい接続ファクトリと新しい接続を作成しますが、これらの例は大きなシステムの例ではなく、「ハウツー」の例の 1 つです。

接続ファクトリをキャッシュする必要がある場合、JMS 接続への単一の管理された参照を維持することは受け入れられるイディオムですか? 新しいメッセージごとに両方を再作成する必要がありますか?

接続ファクトリを再利用するのは理にかなっていますが、毎回新しい接続を使用しますか?

4

1 に答える 1

1

メッセージシステムは非同期であるはずです...

そのため、アプリケーションの存続期間中、接続を開いたままにしておく必要があります。

JMS は現在、作成する必要があるオブジェクトに関して少し冗長であるため、接続とセッションを作成する必要があります。

したがって、これを行う必要があります:

接続 = cf.createConnection(...);

セッション = connection.createSession(...);

プロデューサー = session.createProducer(...);

セッションとプロデューサーは常にスレッド内で使用する必要があります。セッションはスレッドの使用を表します。(同期されている限り、複数のスレッド内で再利用できます)

于 2011-11-11T03:25:38.213 に答える