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