接続プールでの CONNECTIONNAMELIST または CCDT の使用

一部の Java EE 環境 ( WebSphere® Application Serverなど) では、 JMS 接続プールが提供されます。 Java SE アプリケーションの実行に使用できるコンテナー。

Java EE 環境で定義された接続ファクトリーを使用して接続を作成するアプリケーションは、この接続ファクトリーの接続プールから既存の空き接続を取得するか、接続プールに適切な接続がない場合は新規接続を取得します。

これは、CONNECTIONNAMELIST または CCDTURL プロパティーが定義されて接続ファクトリーが構成されている場合、影響を及ぼす可能性があります。

初めて接続ファクトリーを使用して接続を作成するときに、 Java EE 環境は CONNECTIONNAMELISTのいずれかを使用します。 または CCDTURL を使用して、 IBM® MQ システムへの新規接続を作成します。 この接続は、不要になったときに、接続プールに戻され再使用可能になります。

他の何かが接続ファクトリーから接続を作成する場合、 Java EE 環境は、 CONNECTIONNAMELIST または CCDTURL プロパティーを使用して新規接続を作成するのではなく、接続プールから接続を返します。

キュー・マネージャー・インスタンスで障害が発生したときに接続が使用中になっていると、その接続は廃棄されます。 ただし、接続プール内コンテンツは廃棄されない可能性があります。これはつまり、プール内に、既に実行されていないキュー・マネージャーへのる接続が残される可能性があることを意味します。

このような場合、次回接続ファクトリーから接続を作成する要求が出されると、障害が発生したキュー・マネージャーに対する接続が戻されます。 キュー・マネージャーがもう実行していないため、この接続を使用する試みはすべて失敗し、接続が廃棄される原因となります。

接続プールが空の場合にのみ、 Java EE 環境は CONNECTIONNAMELIST プロパティーまたは CCDTURL プロパティーを使用して IBM MQへの新規接続を作成します。

CONNECTIONNAMELIST および CCDT を使用して JMS 接続を作成する方法により、異なる IBM MQ システムへの接続を含む接続プールを使用することもできます。

例えば、次の値に設定された CONNECTIONNAMELIST プロパティーで接続ファクトリーが構成されていると想定します。
CONNECTIONNAMELIST = hostname1(port1), hostname2(port2)

アプリケーションが初めてこの接続ファクトリーからスタンドアロン・キュー・マネージャーへの接続の作成を試みたときに、システム hostname1(port1) で実行しているキュー・マネージャーにアクセスできなかったと想定します。 その結果、アプリケーションは hostname2(port2) で実行しているキュー・マネージャーに対する接続を使用することになります。

これで、別のアプリケーションが現れ、同じ接続ファクトリーから JMS 接続を作成します。 hostname1(port1) 上のキュー・マネージャーが使用可能になったため、この IBM MQ システムへの新しい JMS 接続が作成され、アプリケーションに返されます。

両方のアプリケーションが終了したら、 JMS Connections を閉じます。これにより、接続が接続プールに戻されます。

結果として、接続ファクトリーの接続プールに以下の 2 つの JMS 接続が含まれるようになります。
  • hostname1(port1) で実行しているキュー・マネージャーに対する 1 つの接続
  • hostname2(port2) で実行しているキュー・マネージャーに対する 1 つの接続

このことが、トランザクション・リカバリーに関連する問題につながる可能性があります。 Java EE システムがトランザクションをロールバックする必要がある場合、トランザクション・ログにアクセスできるキュー・マネージャーに接続できる必要があります。