4.2.2 非請求通知の処理

非請求通知とは、ATMIクライアントが予期していないサービス・リクエストに対するレスポンス(またはエラー・コード)を受け取る通信です。たとえば、管理者が5分後にシステムをシャットダウンすることを通知するメッセージをブロードキャストした場合などです。

クライアントに非請求メッセージを通知する方法は数多くあります。たとえば、オペレーティング・システムがクライアントにシグナルを送って、クライアントの現在の処理を中断させる方法があります。Oracle Tuxedoシステムでは、ATMI関数が呼び出されるたびに非請求メッセージが到着していないかどうかがデフォルトで確認されます。これはディップ・インと呼ばれる方法で、次の利点があります:

  • すべてのプラットフォームでサポートされています。
  • 現在の処理が中断されません。

ディップ・インでは、メッセージの到着を確認するまでの間隔が長い場合があります。そのため、アプリケーションでtpchkunsol()関数を呼び出して、すでに到着している非請求メッセージがないかどうかを確認できます。tpchkunsol()関数の詳細は、「イベント・ベースのクライアントおよびサーバーのコーディング」を参照してください。

クライアントがtpinit()関数を使用してアプリケーションに参加する場合、フラグを定義して非請求通知メッセージの処理方法を指定できます。クライアントへの通知では、次の表に示す値をflagsに指定できます。

表4-2 TPINIT型バッファのクライアント通知でのフラグ

フラグ 説明
TPU_SIG シグナルによる任意通知を選択します。このフラグは、シングル・スレッドでシングル・コンテキストのアプリケーションのみで使用します。このモードの利点は、直ちに通知できることです。このモードには、次のような不都合があります:
  • ネイティブ・クライアントを実行している場合、呼出し側プロセスで送信元プロセスと同じUIDを使用する必要があります。(ワークステーション・クライアントには、この制約はありません。)
  • すべてのプラットフォーム上でTPU_SIGが使用できるわけではありません。特に、MS-DOSワークステーションでは使用できません。
システムや環境の要件を満たしていない場合にこのフラグを指定すると、フラグにTPU_DIPが設定され、ログにイベントが記録されます。
TPU_DIP (デフォルト) ディップ・インによる任意通知を選択します。クライアントはtpsetunsol()関数を使用してメッセージ処理関数の名前を指定し、tpchkunsol()関数を使用して待機中の非請求メッセージを確認できます。
TPU_THREAD 別のスレッド内のTHREAD通知を指定します。このフラグは、マルチスレッドをサポートするプラットフォーム専用です。マルチスレッドがサポートされていないプラットフォームでTPU_THREADを指定すると、無効な引数として処理されます。その結果、エラーが返されてtperrno(5)TPEINVALに設定されます。
TPU_IGN 任意通知を無視します。

TPINIT型バッファ・フラグの詳細は、『Oracle Tuxedo ATMI C関数リファレンス』tpinit(3c)に関する項を参照してください。