COBOL を使用した Oracle Tuxedo アプリケーションのプログラミング

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

イベント ベースのクライアントおよびサーバのコーディング

ここでは、以下の内容について説明します。

 


イベントの概要

イベント ベースの通信では、特定の状況 (イベント) が発生すると、Oracle Tuxedo システムのプロセスに通知されます。

Oracle Tuxedo システムには、次の 2 種類のイベント ベースの通信があります。

非請求イベント

非請求イベントは、メッセージを待たないクライアント プログラム、またはメッセージを要求しないクライアント プログラムとの通信に使用されるメッセージです。

ブローカ イベント

ブローカ イベントを使用すると、メッセージの受信と配信を行う「無名」ブローカを介して、クライアントとサーバが透過的に通信できるようになります。このブローカを使用した通信は、Oracle Tuxedo システムの基本要素であるクライアント/サーバ通信パラダイムの 1 つです。

イベント ブローカは、イベント ポスト メッセージを受信してフィルタ処理し、それらのメッセージをサブスクライバに配布する Oracle Tuxedo のサブシステムです。ポスト元とは、特定のイベントが発生したときにそれをイベント ブローカに報告 (ポスト) する Oracle Tuxedo システムのプロセスです。サブスクライバとは、特定のイベントがポストされたときに常に通知する必要がある Oracle Tuxedo システムのプロセスです。

Oracle Tuxedo システムでは、サービスの要求側と提供側の数の比率が一定である必要はなく、任意の数のポスト元が任意の数のサブスクライバに対してメッセージをポストできます。ポスト元は単にイベントをポストするだけで、情報を受信するプロセスや、情報の処理方法については関知しません。サブスクライバには指定されたイベントが通知されますが、その情報のポスト元は通知されません。このように、イベント ブローカでは位置透過性が実現されます。

通常、イベント ブローカ アプリケーションは、例外イベントを処理します。アプリケーションの設計者は、アプリケーション内でどのイベントを例外イベントとして定義して監視する必要があるのかを決定しなければなりません。たとえば、銀行業務アプリケーションでは、高額な引き出しがあったときにイベントがポストされるように設定し、すべての引き出しに対してイベントがポストされる必要はありません。また、すべてのユーザがそのイベントをサブスクライブする必要はありません。支店長だけに通知すれば十分です。

通知処理

イベントがポストされると、イベント ブローカはイベントをサブスクライブしているクライアントまたはサーバに対して、1 つ以上の通知処理を行います。次の表は、イベント ブローカが行う通知処理の種類を示しています。

表 8-1 イベント ブローカの通知処理
通知処理
説明
非請求通知メッセージ
クライアントは、TPNOTIFY ルーチンで送信された場合と同じように、クライアントの非請求メッセージ処理ルーチンでイベント通知メッセージを受信します。
サービス呼び出し
サーバは、TPACALL によって送信された場合と同じように、サービス ルーチンに対する入力としてイベント通知メッセージを受け取ります。
信頼性の高いキュー
イベント通知メッセージは、TPDEQUEUE(3cbl) を使用して、Oracle Tuxedo システムの高信頼性キューに格納されます。イベント通知レコードは、内容が要求されるまで格納されます。Oracle Tuxedo システムのクライアントまたはサーバ プロセスで TPDEQUEUE(3cbl) を呼び出して、この通知レコードを取り出すことができます。または、TMQFORWARD(5) を設定して、通知レコードを取り出す Oracle Tuxedo システムのサービス ルーチンを自動的にディスパッチすることもできます。
/Q の詳細については、『Tuxedo /Q コンポーネント』を参照してください。

アプリケーション管理者は、Oracle Tuxedo の管理用 API を使用して、次の通知処理を行う EVENT_MIB(5) エントリを作成できます。

注意: EVENT_MIB(5) エントリを作成できるのは、Oracle Tuxedo アプリケーション管理者だけです。

EVENT_MIB(5) の詳細については、『Oracle Tuxedo のファイル形式とデータ記述方法』を参照してください。

イベント ブローカ サーバ

TMUSREVT は Oracle Tuxedo システムで提供されるサーバで、ユーザ定義のイベントに対するイベント ブローカとして動作します。TMUSREVT はイベント レポート用のメッセージ レコードを処理し、それらのレコードをフィルタ処理して配信します。イベントのブローカ処理を行うには、Oracle Tuxedo アプリケーション管理者がこれらのサーバを 1 つ以上起動する必要があります。

TMSYSEVT は Oracle Tuxedo システムで提供されるサーバで、システム定義のイベントに対するイベント ブローカとして動作します。TMSYSEVTTMUSREVT は似ています。ただし、別個のサーバが提供されているので、アプリケーション管理者はこの 2 種類のイベント通知に対して異なる処理方法を取り入れることができます。詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

システム定義のイベント

Oracle Tuxedo システムでは、システムの警告と障害に関連する定義済みの特定のイベントが検出されてポストされます。これらの処理はイベント ブローカによって行われます。たとえば、システム定義のイベントには、設定の変更、状態の変更、接続の障害、マシンの分断などがあります。イベント ブローカによって検出されるシステム定義のイベントの全リストについては、『Oracle Tuxedo のファイル形式とデータ記述方法』の「EVENTS(5)」を参照してください。

システム定義のイベントは、Oracle Tuxedo システムで定義されているので、ポストする必要はありません。システム定義のイベント名は、アプリケーション定義のイベント名とは異なり、必ずドット (「.」) で始まります。アプリケーション定義のイベント名をドットで始めることはできません。

クライアントとサーバは、システム定義のイベントをサブスクライブできます。ただし、システム定義のイベントは、アプリケーション内のすべてのクライアントが使用するのではなく、主にアプリケーション管理者が使用します。

イベント ブローカをアプリケーションに組み込む場合、イベント ブローカが多数のサブスクライバに大量の配信を行うためのシステムではないことを考慮してください。発生するすべての動作に対してイベントをポストしないでください。また、すべてのクライアントとサーバがイベントをサブスクライブする必要はありません。イベント ブローカに負荷がかかると、システムのパフォーマンスに影響し、通知が行われなくなる場合があります。負荷を最小限にするには、『Oracle Tuxedo システムのインストール』で説明するように、アプリケーション管理者がオペレーティング システムの IPC リソースを慎重に調整する必要があります。

イベント ブローカ プログラミング インタフェース

イベント ブローカ プログラミング インタフェースは、ワークステーションを含むすべての Oracle Tuxedo システムのサーバ プロセスおよびクライアント プロセスに対して C 言語および COBOL 言語で使用できます。

プログラマは、次の処理をコーディングします。

  1. クライアントまたはサーバは、アプリケーション定義のイベント名にレコードをポストします。
  2. ポストされたレコードは、そのイベントをサブスクライブしている任意の数のプロセスに転送されます。

サブスクライバへの通知方法にはいろいろな方法 (「通知処理」を参照) があり、イベントはフィルタ処理されます。通知処理とフィルタ処理は、プログラミング インタフェースと Oracle Tuxedo システムの管理用 API を使用して設定します。

 


非請求メッセージ ハンドラの定義

非請求メッセージ ハンドラを定義するには、次の文法を使用して TPSETUNSOL(3cbl) ルーチンを呼び出します。

01 CURR-ROUTINE   PIC S9(9) COMP-5.
01 PREV-ROUTINE PIC S9(9) COMP-5.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPSETUNSOL" USING CURR-ROUTINE PREV-ROUTINE TPSTATUS-REC.

TPSETUNSOL を使用すると、非請求メッセージが Oracle Tuxedo システム ライブラリによって受信されたときに呼び出されるルーチンをクライアントが識別できるようになります。TPSETUNSOL を初めて呼び出す前に、クライアントに代わって Oracle Tuxedo システム ライブラリが受信した非請求メッセージはログに記録されるだけで無視されます。システムが通知や検出に使用する処理方法は、アプリケーションのデフォルト設定によって決まります。このデフォルト設定は、クライアントごとに変更できます。詳細については、『Tuxedo COBOL リファレンス』の「TPINITIALIZE(3cbl)」を参照してください。

CURR-ROUTINE パラメータは、非請求メッセージを処理する 16 種類の定義済みルーチンを識別します。これらのルーチンには、C ルーチンとしては tm_displatch1_tm_dispatch8 の 8 種類、COBOL ルーチンとしては TMDISPATCH9TMDISPATCH16 の 8 種類があります。また、CURR-ROUTINE に 0 を設定した場合、Oracle Tuxedo システム ライブラリがクライアントに代わって受信した非請求メッセージはログに記録されるだけで無視されます。C ルーチンは、TPSETUNSOL(3cbl) のパラメータ定義に準拠している必要があります。COBOL ルーチンを使用する場合は、TPGETUNSOL を呼び出してデータを受信する必要があります。

次のサンプル コードは、COBOL プログラムでの非請求ルーチンの設定方法を示しています。

コード リスト 8-1 非請求ルーチンの設定
*
* TPSETUNSOL を呼び出します。 - COBOL 非請求メッセージ ハンドラを設定します。
* TMDISPATCH9 ルーチンが呼び出されます。
*
MOVE 9 to CURR-ROUTINE.
CALL "TPSETUNSOL" USING
CURR-ROUTINE
PREV-ROUTINE
TPSTATUS-REC.
IF NOT TPOK
Routine TMDISPATCH9 will receive unsolicited messages
ELSE
Process error condition

 


非請求メッセージの送信

Oracle Tuxedo システムでは、要求/応答型呼び出しまたは会話型通信の処理を妨げずに、クライアント プロセスに非請求メッセージを送信できます。

非請求メッセージは、名前、または以前に処理されたメッセージと共に受信した識別子を使用して、クライアント プロセスに送信できます。名前による送信には TPBROADCAST(3cbl)、識別子による送信には TPNOTIFY(3cbl) を使用します。TPBROADCAST で送信されるメッセージの発信元は、サービスまたは別のクライアントです。TPNOTIFY で送信されるメッセージの発信元は、サービスだけです。

名前によるメッセージのブロードキャスト

TPBROADCAST(3cbl) ルーチンを使用すると、アプリケーションの登録されたクライアントにメッセージが送信されます。TPBROADCAST ルーチンは、サービスまたは別のクライアントから呼び出すことができます。登録されたクライアントとは、TPINITIALIZE を呼び出したが、まだ TPTERM を呼び出してはいないクライアントのことです。

TPBROADCAST ルーチンの呼び出しには、次の文法を使用します。

01 TPBCTDEF-REC.
COPY TPBCTDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPBROADCAST" USING TPBCTDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.

次の表は、TPBCTDEF-REC データ構造体のメンバーを示しています。

表 8-2 TPBCTDEF-REC データ構造体のメンバー
メンバー
説明
LMID
クライアントの論理マシン識別子を指すポインタ。SPACES 値をワイルドカードとして使用できるので、複数のクライアントにメッセージを送信できます。
USRNAME
クライアント プロセスのユーザ名が存在する場合、そのユーザ名。SPACES 値をワイルドカードとして使用できるので、複数のクライアントにメッセージを送信できます。
CLTNAME
クライアント プロセスのクライアント名が存在する場合、そのクライアント名。NULL 値をワイルドカードとして使用できるので、複数のクライアントにメッセージを送信できます。
設定値 (TPBLOCK-FLAG など)
TPBROADCAST コマンドの設定値。使用できる設定値については、『Tuxedo COBOL リファレンス』の「TPBROADCAST(3cbl)」を参照してください。

TPTYPE-REC レコードの詳細については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「サービスの定義」を参照してください。

次のサンプル コードは、すべてのクライアントを送信先として TPBROADCAST を呼び出す方法を示しています。送信メッセージは、STRING 型レコード内にあります。

コード リスト 8-2 TPBROADCAST の使用
    . . .
**************************************************
* ブロードキャストにレコードを用意します。
**************************************************
MOVE "HELLO, WORLD" TO DATA-REC.
MOVE 11 TO LEN.
MOVE "STRING" TO REC-TYPE.
*
SET TPNOBLOCK TO TRUE.
SET TPNOTIME TO TRUE.
SET TPSIGRSTRT TO TRUE.
*
MOVE SPACES TO LMID.
MOVE SPACES TO USRNAME.
MOVE SPACES TO CLTNAME.
CALL "TPBROADCAST" USING TPBCTDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error processing

識別子によるメッセージのブロードキャスト

TPNOTIFY(3cbl) ルーチンを使用すると、以前に処理されたメッセージと共に受信した識別子を使用してメッセージがブロードキャストされます。TPNOTIFY ルーチンは、サービスからのみ呼び出すことができます。

TPNOTIFY ルーチンの呼び出しには、次の文法を使用します。

01 TPSVCDEF-REC.
COPY TPSVCDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPNOTIFY" USING TPSVCDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.

TPSVCDEF-REC データ構造体については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「グローバル トランザクションのコーディング」を参照してください。TPTYPE-REC レコードについては、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「サービスの定義」を参照してください。

 


非請求メッセージの確認

クライアントが「ディップ イン」通知モードで実行されている場合に非請求メッセージがあるかどうかを確認するには、次の文法を使用して TPCHKUNSOL(3cbl) ルーチンを呼び出します。

01 MSG-NUM          PIC S9(9)  COMP-5.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPCHKUNSOL" USING MSG-NUM TPSTATUS-REC.

未処理のメッセージがある場合、TPSETUNSOL で指定された非請求メッセージ処理ルーチンが呼び出されます。処理が終了すると、このルーチンは処理した非請求メッセージの数を返し、[TPOK] に TP-STATUS を設定します。

クライアントがシグナル ベースまたはスレッド ベースの通知モードで実行されている場合、またはクライアントが非請求メッセージを無視している場合にこのルーチンを呼び出すと、ルーチンは何も処理を行わずにすぐに制御を戻します。

次の例は、非請求メッセージが到着しているかどうかを確認する方法を示しています。

コード リスト 8-3 非請求メッセージの到着
*
* 非請求メッセージを確認します。
*
CALL "TPCHKUNSOL" USING MESS-NUM
TPSTATUS-REC.
*
IF TPOK
IF MESS-NUM IS = 0
No messages were processed by the
unsolicited routine
ELSE
MESS-NUM number of messages were
processed by the unsolicited routine
END-IF
ELSE
process error
END-IF

 


非請求メッセージの取得

非請求メッセージを取得するには、TPGETUNSOL(3cbl) ルーチンを呼び出す必要があります。このルーチンは、非請求メッセージ ハンドラからのみ呼び出すことができます。TPGETUNSOL ルーチンの呼び出しには、次の文法を使用します。

01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User data.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPGETUNSOL" USING TPTYPE-REC DATA-REC TPSTATUS-REC.

TPTYPE-REC レコードの詳細については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「サービスの定義」を参照してください。

次の例は、非請求メッセージの取得方法を示しています。

コード リスト 8-4 非請求メッセージの取得
 IDENTIFICATION DIVISION.
PROGRAM-ID. TMDISPATCH9.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. USL-486.
OBJECT-COMPUTER. USL-486.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
*
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 DATA-REC PIC X(1000).
*
PROCEDURE DIVISION.
*
A-000.
*
MOVE "CARRAY" TO REC-TYPE.
MOVE 1000 TO LEN.
CALL "TPGETUNSOL" USING TPTYPE-REC
DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
*
Process message
DISPLAY "TPGETUNSOL IS TPOK".
DISPLAY "MESSAGE IS" DATA-REC.
DISPLAY "LENGTH IS" LEN.
EXIT PROGRAM.
*

 


イベントのサブスクライブ

TPSUBSCRIBE(3cbl) ルーチンを使用すると、Oracle Tuxedo システムのクライアントまたはサーバがイベントをサブスクライブできるようになります。

サブスクライバは、非請求通知メッセージ、サービス呼び出し、高い信頼性のキュー、またはアプリケーション管理者が設定する別の通知方法によって、通知を受け取ります。別の通知方法の設定については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

TPSUBSCRIBE ルーチンの呼び出しには、次の文法を使用します。

01  TPEVTDEF-REC.
COPY TPEVTDEF.
01  TPQUEDEF-REC.
COPY TPQUEDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL “TPSUBSCRIBE” USING TPEVTDEF-REC TPQUEDEF-REC TPSTATUS-REC

TPEVTDEF-REC データ構造体の文法は、次のとおりです。

05 TPBLOCK-FLAG         PIC S9(9) COMP-5.
88 TPBLOCK VALUE 0.
88 TPNOBLOCK VALUE 1.
05 TPTRAN-FLAG PIC S9(9) COMP-5.
88 TPTRAN VALUE 0.
88 TPNOTRAN VALUE 1.
05 TPREPLY-FLAG PIC S9(9) COMP-5.
88 TPREPLY VALUE 0.
88 TPNOREPLY VALUE 1.
05 TPTIME-FLAG PIC S9(9) COMP-5.
88 TPTIME VALUE 0.
88 TPNOTIME VALUE 1.
05 TPSIGRSTRT-FLAG PIC S9(9) COMP-5.
88 TPNOSIGRSTRT VALUE 0.
88 TPSIGRSTRT VALUE 1.
05 TPEV-METHOD-FLAG PIC S9(9) COMP-5.
88 TPEVNOTIFY VALUE 0.
88 TPEVSERVICE VALUE 1.
88 TPEVQUEUE VALUE 2.
05 TPEV-PERSIST-FLAG PIC S9(9) COMP-5.
88 TPEVNOPERSIST VALUE 0.
88 TPEVPERSIST VALUE 1.
05 TPEV-TRAN-FLAG PIC S9(9) COMP-5.
88 TPEVNOTRAN VALUE 0.
88 TPEVTRAN VALUE 1.
*
05 EVENT-COUNT PIC S9(9) COMP-5.
05 SUBSCRIPTION-HANDLE PIC S9(9) COMP-5.
05 NAME-1 PIC X(31).
05 NAME-2 PIC X(31).
05 EVENT-NAME PIC X(31).
05 EVENT-EXPR PIC X(255).
05 EVENT-FILTER PIC X(255).

次の表は、TPEVTDEF-REC データ構造体のメンバーを示しています。

メンバー
説明
EVENT-COUNT
イベント カウント。
SUBSCRIPTION-HANDLE
サブスクリプション ハンドル。
NAME-1NAME-2
キューに登録された空間の名前。サブスクライバが TPEVQUEUE を設定した場合、イベント通知は NAME-1 で指定されるキュー スペースと、NAME-2 で指定されるキューに登録されます。
EVENT-NAME
イベント名。
EVENT-EXPR

サブスクライブするイベント。正規表現を含み、NULL 文字で終了する最大 255 文字の文字列を指定します。正規表現は、tpsubscribe(3c) で指定された形式です (『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』を参照)。たとえば、次のように eventexpr を設定します。

  • "\\..*" - 呼び出し側は、すべてのシステム定義のイベントをサブスクライブします。
  • "\\.SysServer.*" - 呼び出し側は、サーバに関連するすべてのシステム定義のイベントをサブスクライブします。
  • "[A-Z].*" - 呼び出し側は、A ~ Z の大文字で始まるすべてのユーザ定義のイベントをサブスクライブします。
  • ".*(ERR|err).*" - 呼び出し側は、account_error または ERROR_STATE など、イベント名に ERR または err を含むすべてのユーザ定義のイベントをサブスクライブします。
EVENT-FILTER
ブール型のフィルタ規則を含む文字列。イベント ブローカがイベントをポストする前に、この規則を評価する必要があります。ポストするイベントを受け取ると、イベント ブローカはそのイベントのデータにフィルタ規則 (定義されている場合) を適用します。データが正しく評価された場合、イベント ブローカは指定された通知方法を呼び出します。正しく評価されなかった場合、イベント ブローカは指定された通知方法を無視します。呼び出し側は、異なるフィルタ ルールを利用して同じイベントを何度でもサブスクライブすることができます。
イベント フィルタ機能を使用すると、サブスクライバは通知されるイベントを限定できます。たとえば、100 万円を超える額の引き出しがあった場合に、イベントがポストされるとします。その場合、サブスクライバが 100 万円より高い額 (たとえば 500 万円) の通知だけを必要とすることがあります。または、特定の顧客による高額の引き出しの通知だけを必要とする場合があります。
フィルタ ルールは、フィルタ ルールの適用対象となる型付きレコードによって異なります。フィルタ規則の詳細については、『Tuxedo COBOL リファレンス』の「TPSUBSCRIBE(3cbl)」リファレンス ページを参照してください。
SETTINGS
(TPBLOCK-FLAG

TPTRAN-FLAG、など)
サーバの特性を制御するその他の設定。設定値の詳細については、『Tuxedo COBOL リファレンス』を参照してください。

TPQUEDEF-REC データ構造体の詳細については、『Tuxedo /Q コンポーネント』を参照してください。

システム定義のイベントとアプリケーション定義のイベントは、TPSUBSCRIBE ルーチンを使用してサブスクライブできます。

サブスクリプション、および MIB を更新するために Oracle Tuxedo システムのサーバ プロセスで実行されるサービス ルーチンは、信頼されたコードと見なされます。

このルーチンの詳細については、『Tuxedo COBOL リファレンス』の「TPSUBSCRIBE(3cbl)」を参照してください。

 


イベントに対するサブスクリプションの削除

TPUNSUBSCRIBE(3cbl) ルーチンを使用すると、Oracle Tuxedo システムのクライアントまたはサーバがイベントに対するサブスクリプションを削除できます。

TPUNSUBSCRIBE ルーチンの呼び出しには、次の文法を使用します。

01  TPEVTDEF-REC.
COPY TPEVTDEF.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL “TPUNSUBSCRIBE” USING TPEVTDEF-REC TPSTATUS-REC

TPEVTDEF-REC データ構造体の詳細については、「イベントのサブスクライブ」を参照してください。TPQUEDEF-REC データ構造体の詳細については、『Tuxedo /Q コンポーネント』を参照してください。

 


イベントのポスト

TPPOST(3cbl) ルーチンを使用すると、Oracle Tuxedo のクライアントまたはサーバがイベントをポストできます。

TPPOST ルーチンの呼び出しには、次の文法を使用します。

01  TPEVTDEF-REC.
COPY TPEVTDEF.
01 TPTYPE-REC.
COPY TPSTATUS.
01 TPDATA-REC.
COPY TPSTATUS.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL “TPPST” USING TPEVTDEF-REC TPTYPE-REC TPDATA-REC TPSTATUS-REC

TPEVTDEF-REC データ構造体の詳細については、「イベントのサブスクライブ」を参照してください。TPTYPE-REC レコードについては、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「サービスの定義」を参照してください。


  ページの先頭       前  次