|
会話型通信は Oracle Tuxedo システムのメッセージ交換のパラダイムで、人の会話に似た通信がクライアントとサーバ間で実装されています。この通信方法では、クライアント (開始プロセス) とサーバ (従属サーバ) 間で仮想接続が行われて、双方で会話の状態に関する情報が保持されます。この接続は、接続を終了するイベントが発生するまで継続します。
会話型通信では、クライアントとサーバ間に半二重接続が確立されます。半二重接続では、メッセージが 1 方向だけに送信されます。接続に関する制御は、開始プロセスから従属サーバへ、またはその逆に移ります。制御を持つプロセスがメッセージを送信でき、持たないプロセスは受信しかできません。
以下に銀行業務のオンライン アプリケーションを例に、Oracle Tuxedo アプリケーションで行われる会話型通信について説明します。この例では、銀行の顧客が過去 2 か月間の当座預金の明細書を要求しています。

| 注意 : | 口座レコード管理システムでは、状態情報を保持して、顧客が More プロンプトを選択した場合にどの明細書を送るのか認識できるようにする必要があります。 |
要求/応答型通信の場合と同じように、Oracle Tuxedo システムでは型付きレコードを使用してデータが渡されます。アプリケーションがレコード タイプを認識できることが必要です。レコード タイプの詳細については、「型付きレコードの概要」を参照してください。
会話型クライアントは、サービスへの接続を確立する前に、TPINITIALIZE を呼び出してアプリケーションに参加する必要があります。詳細については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「クライアントのコーディング」を参照してください。
TPCONNECT(3cbl) ルーチンは、会話を行うための接続を確立します。
TPCONNECT ルーチンの呼び出しには、次の文法を使用します。
01 TPSVCDEF-REC.
COPY TPSVCDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPCONNECT" USING TPSVCDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.
TPSVCDEF-REC レコードの詳細については、「サービスの定義」を参照してください。TPTYPE-REC レコードの詳細については、「型付きレコードの定義」を参照してください。
接続が確立されると同時に、DATA-REC を使用して、LEN IN TPTYPE-REC に指定されたデータ長でデータを送信できます。DATA-REC のデータの REC-TYPE と SUB-TYPE は、呼び出されたサービスで認識できるタイプであることが必要です。データが送信されていない場合は、REC-TYPE の値は SPACES であり、DATA-REC と LEN は無視されます。
TPCONNECT または TPSVCSTART によって接続が確立されると、Oracle Tuxedo システムから通信ハンドル (COMM-HANDLE IN TPSVCDEF-REC) が返されます。この COMM-HANDLE は、特定の会話で以降に送られるメッセージを識別するために使用されます。クライアントまたは会話型サービスは、複数の会話に同時に参加できます。最大 64 個の会話を同時に行うことができます。
TPCONNECT の呼び出しが失敗すると、対応するエラー コードが TP-STATUS に設定されます。エラー コードについては、『Tuxedo COBOL リファレンス』の「TPCONNECT(3cbl)」を参照してください。
次のサンプル コードは、TPCONNECT ルーチンの使用方法を示しています。
. . .
* 送信するレコードを準備
MOVE "HELLO" TO DATA-REC.
MOVE 5 TO LEN.
MOVE "STRING" TO REC-TYPE.
*
SET TPBLOCK TO TRUE.
SET TPNOTRAN TO TRUE.
SET TPNOTIME TO TRUE.
SET TPSIGRSTRT TO TRUE.
SET TPSENDONLY TO TRUE.
*
CALL "TPCONNECT" USING TPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error processing ...ELSE
COMM-HANDLEis valid.
Oracle Tuxedo システムで会話型接続が確立されると、開始プロセスと従属サーバ間の通信は送信呼び出しと受信呼び出しによって行われます。接続の制御を持つプロセスは、TPSEND(3cbl) ルーチンを使用してメッセージを送信できます。制御がないプロセスは、TPRECV(3cbl) ルーチンを使用してメッセージを受信できます。
| 注意 : | 発信元 (クライアント) は、最初に TPCONNECT 呼び出しの TPSENDONLY または TPRECVONLY フラグを使用して、どのプロセスが制御を持っているのかを判別します。TPSENDONLY は、発信元が制御を持つことを示します。TPRECVONLY は、呼び出されたサービスに制御が渡されたことを示します。 |
メッセージを送信するには TPSEND(3cbl) ルーチンを使用します。このルーチンには、次の文法を使用します。
01TPSVCDEF-REC.
COPY TPSVCDEF.
01TPTYPE-REC.
COPY TPTYPE.
01DATA-REC.
COPY User Data.
01TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPSEND" USING TPSVCDEF-REC TPTYPE-REC USER-DATA-REC TPSTATUS-REC.
TPSVCDEF-REC レコードの詳細については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「サービスの定義」を参照してください。TPTYPE-REC レコードの詳細については、「型付きレコードの定義」を参照してください。
TPSEND ルーチンが失敗すると、対応するエラー コードが TP-STATUS に設定されます。エラー コードについては、『Tuxedo COBOL リファレンス』の「TPSEND(3cbl)」を参照してください。
TPSEND ルーチンを呼び出すたびに、制御を渡す必要はありません。一部のアプリケーションでは、TPSEND の呼び出しを認められているプロセスが、制御をほかのプロセスに渡すまで、現在のタスクで必要な回数だけ呼び出しを実行できます。ただし、プログラムのロジックによっては、会話が継続する間は常に 1 つのプロセスが接続の制御を持たなければならないアプリケーションもあります。
次のサンプル コードは、TPSEND ルーチンの呼び出し方法を示しています。
. . .
SET TPNOBLOCK TO TRUE.
SET TPNOTIME TO TRUE.
SET TPSIGRSTRT TO TRUE.
SET TPRECVONLY TO TRUE.
*
CALL "TPSEND" USING TPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error processing . . .
オープン接続を介してデータを受信するには、TPRECV(3cbl) ルーチンを使用します。この関数には、次の文法を使用します。
01TPSVCDEF-REC.
COPY TPSVCDEF.
01TPTYPE-REC.
COPY TPTYPE.
01DATA-REC.
COPY User Data.
01TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPRECV" USING TPSVCDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.
TPSVCDEF-REC レコードの詳細については、「サービスの定義」を参照してください。TPTYPE-REC レコードの詳細については、「型付きレコードの定義」を参照してください。
次のサンプル コードは、TPRECV ルーチンの使用方法を示しています。
. . .
SET TPNOCHANGE TO TRUE.
SET TPBLOCK TO TRUE.
SET TPNOTIME TO TRUE.
SET TPSIGRSTRT TO TRUE.
*
MOVE LENGTH OF DATA-REC TO LEN.
*
CALL "TPRECV" USING TPSVCDEF-REC
TPTYPE-REC
DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error processing . . .
TPRETURN の呼び出しが成功した場合TPRETURN の呼び出しが成功した場合| 注意 : | TPRETURN ルーチンについては、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「クライアントおよびサーバへの要求/応答のコーディング」を参照してください。 |
以下の節では、会話を正常に終了する方法について、2 つの例を挙げて説明します。これらの会話には、TPRETURN 関数を使用するグローバル トランザクションは含まれていません。
最初の例では、2 つのコンポーネント間の単純な会話を終了する方法を示します。2 番目の例では、会話が階層構造になっている複雑な会話を終了する方法を示します。
接続がオープンになっているときに会話を終了すると、エラーが返されます。その場合、TPCOMMIT または TPRETURN は失敗します。
次の図は、正常に終了する A と B 間の単純な会話を示しています。

TPSENDONLY フラグで TPCONNECT を呼び出して接続を設定します。このフラグは、B が会話の受信側であることを示します。TPRECVONLY フラグで TPSEND を呼び出して、接続の制御を B に移します。その結果、TPEV_SENDONLY イベントが生成されます。TPRECV を呼び出すと TP-STATUS に TPEEVENT が設定されます。TPEVENT に TPEV_SENDONLY が返されて、制御が B に移ったことが示されます。TPRETURN-VAL IN TPSVCRET に TPSUCCESS を設定して TPRETURN を呼び出します。この呼び出しにより、A に対して TPEV_SVCSUCC イベントが生成され、接続が正常に切断されます。 TPRECV を呼び出して、イベントが発生したことと会話が終了したことを認識します。イベント TPEV_SVCFAIL が発生した場合でも、この TPRECV への呼び出しでデータを受信できます。 | 注意 : | この例では、A はクライアントまたはサーバのどちらでもかまいませんが、B はサーバでなければなりません。 |
この例では、サービス B は会話のメンバーで、2 番目のサービス C との接続を開始しています。つまり、A - B 間と B - C 間という 2 つのアクティブな接続が存在しています。B がこの両方の接続を制御している場合に TPRETURN の呼び出しを行うと、呼び出しは失敗し、すべてのオープン接続に TPEV_SVCERR イベントが通知され、接続が切断されます。
| 注意 : | 会話型サービスは、別のサービスと通信するために要求/応答型の呼び出しを行うことができます。そのため、前述の例では、B から C への呼び出しに TPCONNECT ではなく TPCALL または TPACALL を使用することもできます。ただし、会話型サービスが TPFORWAR を呼び出すことはできません。 |
エラーの発生により接続を終了する唯一の方法は、TPDISCON(3cbl) ルーチンを呼び出すことです。これは、「プラグを抜くこと」と同じです。このルーチンを呼び出すことができるのは、会話の開始プロセス (クライアント) だけです。
| 注意 : | この方法で会話を終了することはお勧めしません。アプリケーションを正常に終了するには、従属サーバで TPRETURN ルーチンを呼び出します。 |
TPDISCON ルーチンの呼び出しには、次の文法を使用します。
01TPSVCDEF-REC.
COPY TPSVCDEF.
01TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPDISCON" USING TPSVCDEF-REC TPSTATUS-REC.
COMM-HANDLE 引数は、接続が確立したときに TPCONNECT ルーチンによって返される通信ハンドルを指定します。
TPDISCON ルーチンは、接続の相手側のサービスに対して TPEV_DISCONIMM イベントを生成し、COMM-HANDLE を無効にします。トランザクションが実行中の場合、そのトランザクションはアボートし、データは失われます。
COMM-HANDLE で接続の開始側と識別されていないサービスから TPDISCON が呼び出されると、そのルーチンは失敗し、エラー コード TPEBADDESC が生成されます。
イベントおよびエラー コードの全リストとその説明については、『Tuxedo COBOL リファレンス』の「TPDISCON(3cbl)」を参照してください。
次のコマンドを使用して、会話型のクライアントおよびサーバをビルドします。
buildclient() (『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「クライアントのビルド」を参照)buildserver() (『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「サーバのビルド」を参照)
会話型サービスと要求/応答型サービスでは、次の操作を行うことはできません。
Oracle Tuxedo システムの会話型通信では、5 つのイベントが認識されます。これらのイベントはすべて TPRECV に通知でき、そのうちの 3 つは TPSEND にも通知できます。
次の表は、イベント、そのイベントを受け取るルーチン、および各イベントの簡単な説明を示しています。
|