30.9. クライアントの再接続とセッションの再割り当て

JBoss EAP メッセージングクライアントは、クライアントとサーバー間の接続で障害が検出された場合に、自動的にサーバーに再接続または再割り当てするように設定できます。

透過的なセッションの再割り当て

ネットワークの一時停止のように一時的な原因で障害が発生し、ターゲットサーバーが再起動されなかった場合、connection-ttl の値より長い間、クライアントが切断されることはないと仮定して、セッションはサーバー上に残ります。「使用済みの接続の検出」を参照してください。

このシナリオでは、再接続が確立されたときに、JBoss EAP がクライアントセッションをサーバーセッションに自動的に再割り当てします。これは 100% 透過的に行われ、クライアントは何も起こらなかったようにそのまま続行できます。

JBoss EAP メッセージングクライアントがサーバーにコマンドを送信すると、送信された各コマンドはインメモリーバッファーに保存されます。接続が失敗し、その後クライアントが再割り当てプロトコルの一部として同じサーバーに再割り当てを試みると、サーバーは正常に受信した最後のコマンドの ID をクライアントに提供します。

クライアントがフェイルオーバー前に受信したよりも多くのコマンドを送信した場合、クライアントとサーバーが状態を回復できるように、送信されたコマンドをバッファーから再生できます。

このバッファーのサイズ (バイト単位) は、confirmationWindowSize プロパティーで設定します。サーバーが confirmationWindowSize バイトのコマンドを受信して処理すると、コマンド確認をクライアントに送り返し、クライアントはバッファー内のスペースを解放できます。

サーバー上で JMS サービスを使用して JMS 接続ファクトリーインスタンスを JNDI にロードする場合、選択した connection-factoryconfirmation-window-size 属性を設定して、サーバー設定にこのプロパティーを設定できます。JMS を使用し、JNDI を使用しない場合、適切なセッターメソッド setConfirmationWindowSize を使用して ActiveMQConnectionFactory インスタンスにこれらの値を直接設定できます。コア API を使用している場合、ServerLocator インスタンスには、公開された setConfirmationWindowSize メソッドもあります。

confirmationWindowSize-1 (デフォルト) に設定すると、バッファリングが無効になり、再割り当てが発生しないようになり、代わりに再接続が強制されます。

セッション再接続

または、サーバーがクラッシュ後に実際に再起動されたか、停止されている可能性があります。このような場合、セッションはサーバー上に存在しなくなり、100% 透過的にそれらに再割り当てることができなくなります。

この場合、JBoss EAP は自動的に接続を再接続し、クライアント上のセッションおよびコンシューマーに対応するサーバー上でセッションとコンシューマーを再作成します。このプロセスは、バックアップサーバーにフェイルオーバーする際に発生するプロセスとまったく同じです。

また、クライアントの再接続は、コアブリッジなどのコンポーネントがターゲットサーバーに再接続できるように、内部的に使用されます。

再接続中にトランザクションセッションと非トランザクションセッションが再接続される方法と、1 回限りの配信保証を維持するために必要な事項を完全に理解するには、「自動クライアントフェイルオーバー」のセクションを参照してください。

再接続属性の設定

クライアントの再接続を設定するには、以下のプロパティーを設定します。

  • retryInterval。このオプションのパラメーターは、ターゲットサーバーへの接続に失敗した場合、後続の再接続試行の間隔 (ミリ秒単位) を設定します。デフォルトの値は 2000 ミリ秒です。
  • retryIntervalMultiplier。このオプションのパラメーターは、最後の再試行から次の再試行までの時間を計算するために時間に適用する乗数を設定します。これにより、再試行の間隔に指数バックオフを実装することができます。

    たとえば、retryInterval1000 ミリ秒に設定し、retryIntervalMultiplier を 2.0 に設定すると、最初の再接続試行が失敗した場合、クライアントは、後続の再接続試行を 1000 ミリ秒、2000 ミリ秒、4000 ミリ秒の順に待機します。

    デフォルト値は 1.0 で、各再接続試行が等間隔であけられることを意味します。

  • maxRetryInterval。このオプションのパラメーターは、使用される最大再試行間隔を設定します。retryIntervalMultiplier を設定しないと、後続の再試行が指数関数的に増加して、途方もなく大きい値になる可能性があります。このパラメーターを設定すると、値の上限を設定できます。デフォルトの値は 2000 ミリ秒です。
  • reconnectAttempts。このオプションのパラメーターには、断念してシャットダウンするまでの再接続試行の総回数を設定します。-1 の値は、無制限の試行回数を示します。デフォルト値は 0 です。

クライアント上で JMS および JNDI を使用して JMS 接続ファクトリーインスタンスを検索する場合は、これらのパラメーターを JNDI コンテキスト環境で指定できます。たとえば、jndi.properties ファイルは以下のようになります。

java.naming.factory.initial = ActiveMQInitialContextFactory
connection.ConnectionFactory=tcp://localhost:8080?retryInterval=1000&retryIntervalMultiplier=1.5&maxRetryInterval=60000&reconnectAttempts=1000

JMS を使用し、JMS 接続ファクトリーを直接インスタンス化する場合は、作成直後に ActiveMQConnectionFactory で適切なセッターメソッドを使用してパラメーターを指定できます。

コア API を使用して、ServerLocator インスタンスを直接インスタンス化する場合は、作成直後に ServerLocator で適切なセッターメソッドを使用してパラメーターを指定することもできます。

クライアントは再接続できるが、サーバーが再起動したかタイムアウトした場合など、サーバーでセッションが使用できなくなった場合、クライアントは再割り当てできず、接続またはセッションに登録されている ExceptionListener または FailureListener インスタンスが呼び出されます。

ExceptionListeners と SessionFailureListeners

クライアントが再接続または再割り当てすると、登録されている JMS ExceptionListener またはコア API SessionFailureListener が呼び出されます。