|
|
TPFORWAR(3cbl)
名前
TPFORWAR() - BEA Tuxedo ATMI のサービス要求を別のルーチンに転送
形式
01 TPSVCDEF-REC.
COPY TPSVCDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User data.
01 TPSTATUS-REC.
COPY TPSTATUS.
COPY TPFORWAR REPLACING TPSVCDEF-REC BY TPSVCDEF-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY DATA-REC
TPSTATUS-REC BY TPSTAUS-REC
機能説明
TPFORWAR() を使用すると、サービス・ルーチンはクライアントの要求を別のサービス・ルーチンに転送して処理させることができます。 TPFORWAR() には EXIT PROGRAM 文が含まれるので、BEA Tuxedo ATMI のディスパッチャに制御を確実に正しく返すために、TPFORWAR() はそれが起動されたルーチンと同じルーチンの中から呼び出されなければなりません。つまり、TPFORWAR() をサービス・ルーチンのサブ・プログラムから呼び出してはなりません。制御が BEA Tuxedo ATMI のディスパッチャに返されないからです。 TPFORWAR() を会話サービスの中から呼び出すことはできません。
このルーチンは、DATA-REC に入っているデータを使用して TPSVCDEF-REC 内の SERVICE-NAME によって指定されるサービスに要求を転送します。 要求を転送するサービス・ルーチンは応答を受け取りません。 要求の転送が終わると、サービス・ルーチンは BEA Tuxedo ATMI のディスパッチャに戻り、他の作業を行える状態になります。 なお、転送された要求からの応答は期待しないため、この要求は、要求を転送するサービスと同じ実行可能プログラム内の任意のサービス・ルーチンに、エラーなしで転送することができます。
サービス・ルーチンがトランザクション・モードであると、このルーチンはトランザクションの呼び出し元の部分を、そのトランザクションの起動元が TPCOMMIT() または TPABORT() のいずれかを出したときに完了できるような状態にします。 トランザクションがサービス・ルーチンの実行中に TPBEGIN() により明示的に開始された場合、このトランザクションを TPCOMMIT() または TPABORT() で終了させてから、TPFORWAR() を呼び出さなければなりません。 このため、転送チェインに関与するすべてのサービスは、トランザクション・モードで起動するか、あるいはどれもトランザクション・モードでは起動しないようにします。
転送チェインの最後のサーバは、TPRETURN() を使用して要求の発信元に応答を返します。 要約して言えば、TPFORWAR() は待機している要求者に応答を返す役割を別のサーバに転送するわけです。
TPFORWAR() は、サービス・ルーチンが出したサービス要求から期待されるすべての応答を受け取った後、呼び出すようにしてください。 受信されていない未終了の応答は、受信後、BEA Tuxedo ATMI のディスパッチャによって自動的に取り除かれます。 さらに、以後、これらの応答の通信ハンドルは無効になり、要求は SERVICE-NAME に転送されません。
DATA-REC は送信されるレコードであり、TPTYPE-REC 内の LEN は、送信する DATA-REC の大きさを指定します。 ただし、DATA-REC が長さの指定を必要としないタイプのレコードである場合 LEN は無視されます (0 でかまいません)。 TPTYPE-REC 内の REC-TYPE が SPACES の場合、DATA-REC および LEN は無視され、長さゼロのデータで要求がデータ長ゼロで送信されます。 REC-TYPE が STRING で、LEN が 0 の場合は、要求はデータ部なしで送信されます。
サービス・ルーチンの作成者は TPFORWAR() の呼び出し後は制御を保持しないので、シグナル・リスタートによるブロッキング送信が使用されます (つまり、TPSIGRSTRT)。 現時点では、TPSVCDEF-REC の設定は将来使用するために予約されており、指定しても無視されます。
戻り値
サービス・ルーチンは、呼び出し元、BEA Tuxedo ATMI のディスパッチャに何も値を返さないので、 TP-STATUS は設定されません。
エラー
このルーチンに渡されたパラメータの処理中またはそのルーチン自体の処理中にエラーが発生した場合、異常終了メッセージが最初の要求元に返されます (応答が送信されない場合を除く)。 未終了の応答または下位接続がある場合や呼び出し元のトランザクションに中途終了マークが付けられた場合には、異常終了メッセージの原因となる障害であるとみなされます。 要求者は、エラーを示す TPESVCERR() によって、異常終了メッセージを検出します。 このようなエラーが発生すると、呼び出し元のデータは送信されません。 また、このエラーが原因で、呼び出し元の現在のトランザクションに中途終了のマークが付けられます。
サービス・ルーチンの処理中あるいは要求の転送中にトランザクション・タイムアウトになると、TPCALL() または TPGETRPLY() で応答を待つ要求元は TPETIME エラーを受け取ります。 また、この要求元はデータを受け取ることはありません。 ただし、サービス・ルーチンは TPRETURN() または TPFORWAR() のいずれかを使用して終了することになっています。 会話サービス・ルーチンは、TPRETURN() を使用しなければならず、TPFORWAR() は使用できません。
サービス・ルーチンが TPRETURN() も TPFORWAR() も使用しない場合、または TPFORWAR() が会話サーバから呼び出された場合、そのサーバはログ・ファイルに警告メッセージを出力し、最初の要求者にサービス・エラーを返します。 下位接続に対するオープン接続はすべて、ただちに切断され、未終了の非同期応答は無効とマークされます。 サーバが異常終了時にトランザクション・モードにあった場合は、そのトランザクションには中途終了マークが付けられます。 TPRETURN() または TPFORWAR() のいずれかがサービス・ルーチンとは別に (たとえば、クライアント、TPSVRINIT()、TPSVRDONE() などから) 使用されても、これらのルーチンは何も影響を及ぼさず終了するだけです。
関連項目
TPCONNECT(3cbl)、TPRETURN(3cbl)
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|