4.6.2 通知イベント・ハンドラ
Joltクライアント・アプリケーションでは、非請求メッセージとブローカ経由のイベント通知の両方に対してイベント・ハンドラ・ルーチン(通知の受信時に呼び出される)が必要になります。Joltでは、1セッションでサポートされるハンドラは1つです。Oracle Tuxedoでは、通知の生成元であるイベントを特定することはできません。したがって、特定のイベントが発生したときに、そのイベント特有のハンドラを呼び出すことはできません。
クライアント・アプリケーション側では、セッションごとに1つのハンドラを用意(onReply()
メソッドをオーバーライド)し、そのセッションでクライアントが受信するすべての通知に対して呼び出されるようにしなければなりません。単一ハンドラによるコールバック関数は、非請求とイベント通知型の両方で使用されます。ハンドラ呼出しの原因となったイベントを特定し、適切な措置を取ることは(ユーザー定義の)ハンドラ・ルーチンの役割です。ユーザーがセッション・ハンドラをオーバーライドしないと、通知メッセージはデフォルトのハンドラによって暗黙のうちに廃棄されます。
Joltクライアントは、JoltSessionクラスのサブクラスを作成し、onReply()
メソッドをユーザー定義されたonReply()
メソッドでオーバーライドすることによって、コールバック関数を提供します。
Oracle Tuxedo/ATMIクライアントでは、ハンドラ・コールバック関数内では、ATMI呼出しのサブセットしか使用することができません。この制約は、Joltクライアントには適用されません。別々のスレッドを使用して、通知をモニターし、イベント・ハンドラ・メソッドを実行します。Joltがサポートするすべての機能をハンドラ内から実行することが可能です。Joltクライアント・プログラムに適用される通常の規則(1セッションにつき1トランザクションなど)は、すべてハンドラにも適用されます。
ハンドラ・メソッドの呼出しは、独立したスレッド内で行われます。別々のスレッドがonReply()
メソッドを同時に実行しないようにするため、アプリケーション開発者は必ずそのメソッドにsynchronizedキーワードを付けるか、またはそのメソッドがスレッド・セーフになるように記述します。
Joltでは、ハンドラ・ルーチンを有効にする暗黙的なモデルが使用されます。クライアントがイベントをサブスクライブすると、Joltはそのクライアントのハンドラを内部で有効にしますが、その結果、非請求メッセージの受信も有効になります。Joltクライアントがイベント通知をサブスクライブする場合は、同時に必ず非請求メッセージも受信します。さらに、これらの2種類の通知に対して、単一のonReply()
メソッドが呼び出されます。
親トピック: イベント・サブスクリプションおよびイベント通知