30.8. 使用済みの接続の検出

このセクションでは、接続の Time-to-Live (TTL) について説明します。また、JBoss EAP メッセージングが、クラッシュしたクライアントおよびリソースを正常にクローズせずに終了したクライアントを処理する方法についても説明します。

サーバー上の使用済みの接続リソースのクリーンアップ

JBoss EAP クライアントアプリケーションが終了する前に、finally ブロックを使用して制御された方法で、そのリソースを閉じる必要があります。

以下は、コアクライアントが finally ブロックでセッションとセッションファクトリーを適切に閉じる例です。

ServerLocator locator = null;
ClientSessionFactory sf = null;
ClientSession session = null;

try {
   locator = ActiveMQClient.createServerLocatorWithoutHA(..);

   sf = locator.createClientSessionFactory();;

   session = sf.createSession(...);

   ... do some stuff with the session...
}
finally {
   if (session != null) {
      session.close();
   }

   if (sf != null) {
      sf.close();
   }

   if(locator != null) {
      locator.close();
   }
}

以下は、適切に動作する JMS クライアントアプリケーションの例です。

Connection jmsConnection = null;

try {
   ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(...);

   jmsConnection = jmsConnectionFactory.createConnection();

   ... do some stuff with the connection...
}
finally {
   if (connection != null) {
      connection.close();
   }
}

ただし、クライアントがクラッシュし、リソースを消去する機会がない場合もあります。これが発生すると、サーバー側のリソースがサーバー上でハングしたままになる可能性があります。これらのリソースを削除しないと、サーバーでリソースリークが発生し、時間が経つにつれてサーバーでメモリーまたは他のリソースが不足する可能性があります。

使用済みのクライアントリソースを消去しようとする場合、重要なことは、クライアントとサーバー間のネットワークに障害が発生した後に復帰し、クライアントが再接続できるという事実を認識することです。JBoss EAP はクライアントの再接続に対応しているため、サーバー側の「使用済みの」リソースをすぐに消去しないようにすることが重要です。そうしないと、クライアントがサーバー上の古いセッションに再接続してリソースを取り戻すことができなくなります。

JBoss EAP は、これらすべてを設定可能にします。ClientSessionFactory の設定ごとに、Time-To-Live (TTL) プロパティーを使用して、クライアントからのデータがない場合にサーバーが接続を有効に保つ時間 (ミリ秒単位) を設定できます。クライアントは、サーバーが接続を閉じないように、定期的に「ping」パケットを自動的に送信します。サーバーが TTL 時間の間に接続でパケットを受信しない場合、その接続に関連するサーバー上のすべてのセッションを自動的に閉じます。

JMS を使用している場合、接続 TTL は ActiveMQConnectionFactory インスタンスの ConnectionTTL 属性によって定義されます。または、JMS 接続ファクトリーインスタンスをサーバー側の JNDI に直接デプロイする場合は、パラメーター connectionTtl を使用して xml 設定に指定できます。

http-connector などのネットワークベース接続の ConnectionTTL のデフォルト値は 60000 (1 分) です。in-vm など、内部接続の接続 TTL のデフォルト値は -1 です。ConnectionTTL-1 の値は、サーバーが、サーバー側で接続をタイムアウトしないことを意味します。

クライアントが独自の接続 TTL を指定しないようにするには、サーバー側でグローバル値を設定します。これを行うに、サーバー設定に connection-ttl-override 属性を指定します。connection-ttl-override のデフォルト値は -1 です。これは「オーバーライドしない」、つまり、クライアントが独自の値を使用できることを意味します。

コアセッションまたは JMS 接続を閉じる

すべてのコアクライアントセッションと JMS 接続は、使用の終了時に常に finally ブロックで明示的に閉じられていることが重要です。

これができない場合、JBoss EAP はガベージコレクション時にこれを検出します。その後、接続を閉じ、以下のような警告をログに記録します。

[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession]  I'm closing a ClientSession you left open. Please make sure you close all ClientSessions explicitly before let
ting them go out of scope!
[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession]  The session you didn't close was created here:
java.lang.Exception
   at org.apache.activemq.artemis.core.client.impl.DelegatingSession.<init>(DelegatingSession.java:83)
   at org.acme.yourproject.YourClass (YourClass.java:666)

JMS を使用している場合、警告は、クライアントセッションではなく、JMS 接続を伴うことに注意してください。また、ログには、閉じられていない JMS 接続またはコアクライアントセッションがインスタンス化されたコードの正確な行が示されます。これにより、コード内のエラーを特定し、適切に修正できます。

クライアント側からの障害の検出

クライアントは、サーバーからデータを受信している限り、接続は有効であると見なします。クライアントが client-failure-check-period ミリ秒のパケットを受信しない場合は、接続が失敗したと見なし、フェイルオーバーを開始するか、クライアントの設定方法に応じて、FailureListener インスタンスまたは ExceptionListener インスタンスを呼び出します。

JMS を使用している場合、この動作は、ActiveMQConnectionFactory インスタンスの ClientFailureCheckPeriod 属性で定義します。

HTTP 接続など、ネットワーク接続におけるクライアント障害チェックの間隔のデフォルト値は 30000 (30 秒) です。in-vm 接続のクライアント障害チェックの間隔のデフォルト値は -1 です。-1 の値は、サーバーからデータが受信されない場合、クライアントがクライアント側で接続に失敗しないことを意味します。接続のタイプに関係なく、一時的な障害が発生した場合にクライアントが再接続できるように、チェックの間隔は通常、サーバー上の接続 TTL の値よりもはるかに短くします。

非同期接続実行の設定

サーバー側で受信されたパケットの多くは、リモーティングスレッドで実行されます。これらのパケットは短時間実行される操作を表し、パフォーマンス上の理由から常にリモーティングスレッドで実行されます。

ただし、デフォルトでは、一部のパケットはスレッドプールからスレッドを使用して実行され、リモーティングスレッドが長時間固定されないようにします。別のスレッドで操作を非同期に処理すると、待ち時間が少し長くなることに注意してください。これらのパケットは、以下のとおりです。

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.RollbackMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCloseMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCommitMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXACommitMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAPrepareMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXARollbackMessage

非同期接続実行を無効にするには、パラメーター async-connection-execution-enabledfalse に設定します。デフォルト値は true です。