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

| 注: | 口座レコード管理システムでは、状態情報を保持して、顧客がMoreプロンプトを選択した場合にどの明細書を送るのか認識できるようにする必要があります。 |
リクエスト/レスポンス型通信の場合と同じように、Oracle Tuxedoシステムでは型付きレコードを使用してデータが渡されます。アプリケーションがレコード・タイプを認識できることが必要です。レコード・タイプの詳細は、「型付きレコードの概要」を参照してください。
会話型のクライアントおよびサーバーには、次の特徴があります。
会話型通信は、次の点でリクエスト/レスポンス型通信と異なります。
会話型クライアントは、サービスへの接続を確立する前に、TPINITIALIZEを呼び出してアプリケーションに参加する必要があります。詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「クライアントのコーディング」を参照してください。
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に設定されます。エラー・コードのリストについては、『Oracle Tuxedo ATMI COBOL関数リファレンス』の「TPCO NNECT(3cbl)」を参照してください。
次のサンプル・コードは、TPCONNECTルーチンの使用方法を示しています。
. . .
* Prepare the record to send
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システムで会話型接続が確立されると、イニシエータとサブオーディネート間の通信は送信呼出しと受信呼出しを使用して行われます。接続の制御を持つプロセスは、TPSEN D(3cbl)ルーチンを使用してメッセージを送信し、制御がないプロセスは、TPRECV( 3cbl)ルーチンを使用してメッセージを受信できます。
| 注: | 発信元(クライアント)は、最初にTPCONNECT呼出しのTPSENDONLYまたはTPRECVONLYフラグの値を使用して、どのプロセスが制御を持っているのかを判別します。TPSENDONLYは、発信元が制御を持つことを示し、TPRECVONLYは、呼び出されたサービスに制御が渡されたことを示します。 |
メッセージを送信するには、TPSEN D(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 ATMIアプリケーションのプログラミング』の「サービスの定義」、TPTYPE-RECレコードの詳細は、「型付きレコードの定義」を参照してください。
TPSENDルーチンが失敗すると、対応するエラー・コードがTP-STATUSに設定されます。エラー・コードのリストについては、『Oracle Tuxedo ATMI COBOL関数リファレンス』の「TPS END(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 . . .
オープン接続を介してデータを受信するには、TPR ECV(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 ATMIアプリケーションのプログラミング』の「クライアントおよびサーバーへのリクエスト/レスポンスのコーディング」を参照してください。 |
次の項では、会話を正常に終了する方法について、2つの例を用いて説明します(これらの会話には、TPRETURN関数を使用するグローバル・トランザクションは含まれていません)。
最初の例では、2つのコンポーネント間の単純な会話を終了する方法を示します。2番目の例では、会話が階層構造になっている複雑な会話を終了する方法を示します。
接続がオープンになっているときに会話を終了すると、エラーが返されます。その場合、TPCOMMITまたはTPRETURNは失敗します。
図7-2は、正常に終了する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はサーバーでなければなりません。 |
図7-3は、正常に終了する階層構造の会話を示しています。
この例では、サービス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が生成されます。
イベントおよびエラー・コードの全リストとその説明については、『Oracle Tuxedo ATMI COBOL関数リファレンス』の「TPDI SCON(3cbl)」を参照してください。
次のコマンドを使用して、会話型のクライアントおよびサーバーをビルドします。
buildclient()(『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「クライアントのビルド」)buildserver()(『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「サーバーのビルド」)会話型サービスとリクエスト/レスポンス型サービスでは、次の操作を行うことはできません。
Oracle Tuxedoシステムの会話型通信では、5つのイベントが認識されます。これらのイベントはすべてTPRECVに通知でき、そのうちの3つはTPSENDにも通知できます。
表7-1は、イベント、そのイベントを受け取るルーチン、および各イベントの詳細な説明を示しています。
|