接続イベント通知を使用すると、Message Queue クライアントは接続のクローズおよび再接続イベントを待機して、通知タイプと接続状態に基づいて適切なアクションを起こすことができます。たとえば、フェイルオーバーが発生してクライアントが別のブローカに再接続された場合、アプリケーションはそのトランザクションの状態をクリーンアップしてから新しいトランザクションに進む必要があるかもしれません。
Message Queue プロバイダは、接続について深刻な問題を検出した場合、接続オブジェクトの登録済みの例外リスナーを呼び出します。このプロバイダは、リスナーの onException メソッドを呼び出し、問題を記述する JMSException 引数にこれを渡します。Message Queue プロバイダはイベント通知 API も提供し、これを使用してクライアントランタイムは、接続状態の変更をアプリケーションに通知できます。通知 API は次の要素によって定義されます。
com.sun.messaging.jms.notification パッケージ。イベントリスナーと通知イベントオブジェクトを定義します。
com.sun.messaging.jms.Connection インタフェース。javax.jms.Connection インタフェースへのエクステンションを定義します。
次の節では、通知をトリガーできるイベントと、イベントリスナーの作成方法について説明します。
次の表は、イベントリスナーによって返されるイベントについて説明したものです。
接続イベントの発生時に JMS 例外リスナーは呼び出されません。例外リスナーが呼び出されるのは、クライアントランタイムの再接続の試行回数が上限に達してしまった場合のみです。クライアントランタイムは、常に例外リスナーの前にイベントリスナーを呼び出します。
表 1–8 通知イベント
イベント タイプ |
意味 |
---|---|
ConnectionClosingEvent |
Message Queue クライアントランタイムは、管理者のシャットダウン要求によって接続がクローズされようとしているという通知をブローカから受信したときに、このイベントを生成します。 |
ConnectionClosedEvent |
Message Queue クライアントランタイムは、ブローカのエラーによって接続がクローズされたか、管理者のシャットダウン要求または再起動要求によって接続がクローズされたときに、このイベントを生成します。 イベントリスナーが ConnectionClosedEvent を受信すると、アプリケーションは受信したイベントの getEventCode() メソッドを使用して、クローズの原因を指定するイベントコードを取得します。 |
ConnectionReconnectedEvent |
Message Queue クライアントランタイムがブローカに再接続されました。このブローカは、このクライアントが以前接続していたものと同じ場合もありますが、別のブローカの場合もあります。 アプリケーションは、受信したイベントの getBrokerAddress メソッドを使用して、再接続先のブローカのアドレスを取得することができます。 |
ConnectionReconnectFailedEvent |
Message Queue クライアントランタイムがブローカへの再接続に失敗しました。再接続の試みに失敗するたびに、ランタイムは新しいイベントを生成し、それをイベントリスナーに配信します。 接続イベントの発生時に JMS 例外リスナーは呼び出されません。呼び出されるのは、クライアントランタイムの再接続の試行回数が上限に達してしまった場合のみです。クライアントランタイムは、常に例外リスナーの前にイベントリスナーを呼び出します。 |
次のコード例は、接続イベントリスナーの設定方法を示したものです。接続イベントが発生するたびに、イベントリスナーの onEvent メソッドがクライアントランタイムによって呼び出されます。
//create an MQ connection factory. com.sun.messaging.ConnectionFactory factory = new com.sun.messaging.ConnectionFactory(); //create an MQ connection. com.sun.messaging.jms.Connection connection = (com.sun.messaging.jms.Connection )factory.createConnection(); //construct an MQ event listener. The listener implements //com.sun.messaging.jms.notification.EventListener interface. com.sun.messaging.jms.notification.EventListener eListener = new ApplicationEventListener(); //set event listener to the MQ connection. connection.setEventListener ( eListener );
この例では、アプリケーションが、そのイベントリスナーが接続イベントをアプリケーションのロギングシステムに記録するように選択します。
public class ApplicationEventListener implements com.sun.messaging.jms.notification.EventListener { public void onEvent ( com.sun.messaging.jms.notification.Event connEvent ) { log (connEvent); } private void log ( com.sun.messaging.jms.notification.Event connEvent ) { String eventCode = connEvent.getEventCode(); String eventMessage = connEvent.getEventMessage(); //write event information to the output stream. } }