10.2.4.2.4 非請求メッセージ

マルチスレッド・アプリケーションまたはマルチコンテキスト・アプリケーションの各コンテキストでは、非請求メッセージを次の3種類のいずれかの方法で処理できます。

処理方法 設定
非請求メッセージの無視 TPU_IGN
ディップ・イン通知 TPU_DIP
専用のスレッド通知 (C言語のアプリケーションのみで利用可能です) TPU_THREAD

以下の事柄に注意してください。

  • SIGNALベースの通知は、マルチスレッド・プロセスまたはマルチコンテキスト・プロセスでは使用できません。
  • アプリケーションを実行しているプラットフォームで、マルチコンテキストがサポートされていてもマルチスレッドがサポートされていない場合、TPU_THREADを使用した非請求通知の処理を行うことはできません。そのため、イベントの即時通知を受け取ることはできません。

    イベントの即時通知を受け取る必要がある場合は、そのプラットフォームでマルチコンテキストを使用するかどうかを慎重に検討します。

  • 専用のスレッド通知は、次のものに対してだけ使用できます。
    • C言語で記述されたアプリケーション
    • Oracle Tuxedoシステムでサポートされているマルチスレッド・プラットフォーム

専用のスレッド通知の場合、非請求メッセージの受信と、非請求メッセージ・ハンドラのディスパッチに別々のスレッドが使用されます。あるコンテキストで一度に実行できる非請求メッセージ・ハンドラは1つだけです。

スレッドがサポートされていないOracle Tuxedoシステム用プラットフォームでtpinit()が呼び出された場合に、スレッドがサポートされていないプラットフォーム上でTPU_THREAD通知が要求されたことを示すパラメータが指定されていると、tpinit()-1を返してtperrnoTPEINVALを設定します。UBBCONFIG(5)のデフォルトのNOTIFYオプションがTHREADに設定されている場合に、特定のマシンでスレッドを使用できないと、そのマシンのデフォルトの機能はDIPINになります。このような動作の相違があるので、スレッドがサポートされているマシンとサポートされていないマシンが混在する環境では、管理者はすべてのマシンにデフォルトを指定できます。ただし、そのマシンで利用できない機能をクライアントが明示的にリクエストすることはできません。

tpsetunsol()がコンテキストに関連付けされていないスレッドから呼び出されると、新しく生成されるすべてのtpinit()コンテキストに対して、プロセス単位のデフォルトの非請求メッセージ・ハンドラが作成されます。特定のコンテキストは、コンテキストがアクティブのときにtpsetunsol()を再度呼び出して、そのコンテキストの非請求メッセージ・ハンドラを変更することができます。プロセス単位のデフォルトの非請求メッセージ・ハンドラは、コンテキストに現在関連付けされていないスレッドでtpsetunsol()を再度呼び出すと、変更できます。

プロセスが同じアプリケーションと複数の関連付けを持つ場合、各関連付けに異なるCLIENTIDを割り当てられ、非請求メッセージを特定のアプリケーションとの関連付けに送信できるようになります。プロセスが同じアプリケーションと複数の関連付けを持つ場合、ブロードキャスト基準を満たすアプリケーションの各関連付けに任意のtpbroadcast()が別々に送信されます。非請求メッセージを受信する場合のディップ・イン・チェックでは、カレントのアプリケーションとの関連付けに送信されるメッセージだけが対象となります。

非請求メッセージ・ハンドラではATMI関数を利用できる他、非請求メッセージ・ハンドラ内でtpgetctxt(3c)を呼び出すことができます。そのため、非請求メッセージ・ハンドラは別のスレッドを生成して、同じコンテキスト内で必要となる実質的なATMI作業を行うことができるようになります。