次の項では、CICSプログラマがOracle Tuxedo Mainframe Adapter for TCP (CICS)(以後TMA TCP for CICSと呼ぶ)と連携するアプリケーション・プログラムを開発または変更する際に注意する必要がある事項について説明しています。
次の項から、CICSプログラマがTMA TCP for CICSをクライアントとして相互運用するアプリケーション・プログラムを開発または変更する際に注意する必要がある事項について説明しています。
CICSアプリケーション・プログラムからリモートのOracle Tuxedoドメインにリクエストを送信するには、EXEC CICS LINK
コマンドを使用します。リクエスト・データとレスポンス・データの正確なレイアウトについては、後述する項で説明します。
構成の整合性と正当性を確保するために、CICSとOracle Tuxedo間で送信されるデータ・バッファのレイアウトについて、CICSアプリケーション・プログラマ、Oracle Tuxedoアプリケーション開発者およびOracle Tuxedo管理者との間の合意が必要です。COBOLやCに備わっているデータ型を使用しているかぎり、CICSプログラマに制限事項は課されません。
CICSプログラムからリモートのOracle Tuxedoドメインに対してサービス呼出しを実行するには、EXEC CICS LINK
呼出しを前処理リクエスタに送信します。アクセス対象にするサービスは、Oracle TMA管理者が構成する必要がありますが、プログラミングに限って言えば、必要な手続きはLINK
呼出しのみです。次のCOBOLレコードは、client.cbl
というCOBOLのコピーブックに収録されています。
01 REQUEST-RECORD.
05 REQUEST-HEADER.
10 DATALEN PIC S9(08) COMP.
10 SVCNAME[16] PIC X(16).
10 REQUESTCD PIC S9(08) COMP.
10 RETURNCD PIC S9(08) COMP.
10 REQRETURNCD PIC S9(08) COMP.
05 REQUEST-DATA.
10 DATA-AREA PIC X(DATALEN).
LINK
呼出しに渡すCの構造体のレイアウトは、リスト5-2に示すとおりです。次のCの構造体は、clienth.h
というインクルード
・ファイルに収録されています。
typedef struct CLIENTHDR
{
long DataLen; /* THE LEN OF THE DATA FROM AND TO APPL */
char SvcName[16]; /* THE SERVICE NAME */
long RequestCd; /* THE REQUEST COMMAND FROM THE APPL */
long ReturnCd; /* THE RETURN CODE TO THE APPL */
long ReqReturnCd; /* THE RETURN CODE FROM THE PREQ AND REQ */
} CLIENTHDR;
typedef struct CMAREA
{
CLIENTHDR CltHdr; /*HEADER */
char Request_data[MAX_DATA_LENGTH]; /* REQUEST DATA */
} CMAREA;
前述のCOBOLとCのサンプルの変数は、次のような定義内容になっています。
DataLen
SvcName
RequestCd
BEA_REQUEST_NORESPONSE
: 値は7です。応答なしのサービス・リクエスト。この場合、サービスを実行するOracle Tuxedoにリクエストが送信されますが、レスポンス・データは返されません。BEA_REQUEST_RESPONSE
: 値は5です。リクエストまたはレスポンス・リクエスト。リクエストはOracle Tuxedoに送信され、レスポンスが返されます。
ReturnCd
注意: | これらのコードに関する説明については、付録Aの「CICSクライアント・プログラムに戻されるコード」の項を参照してください。 |
ReqReturnCd
Request_data
次の例は、COBOLのCICSクライアント・プログラムのサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. TESTCLN.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-3090.
OBJECT-COMPUTER. IBM-3090.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FILLER PIC X(32) VALUE 'SAMPLE COBOL CICS CLIENT PROGRAM'.
01 MSG-AREA.
05 M-DATA PIC X(42) VALUE SPACES.
05 M-RCDE PIC Z(05) VALUE ZEROS.
01 WS-COMMAREA.
05 WC-DATALEN PIC S9(9) COMP-4.
05 WC-SVCNAME PIC X(16).
05 WC-REQUESTCD PIC S9(9) COMP-4.
05 WC-RETURNCD PIC S9(9) COMP-4.
05 WC-REQRETURNCD PIC S9(9) COMP-4.
05 WC-REQDATA PIC X(14).
LINKAGE SECTION.
01 DFHCOMMAREA PIC X(14).
PROCEDURE DIVISION.
A100-ENTRY.
MOVE +14 TO WC-DATALEN.
MOVE 'TOLOWER' TO WC-SVCNAME.
MOVE +5 TO WC-REQUESTCD.
MOVE 'THIS IS A TEST' TO WC-REQDATA.
EXEC CICS LINK PROGRAM('BEAPRERQ')
COMMAREA(WS-COMMAREA)
LENGTH(LENGTH OF WS-COMMAREA)
END-EXEC.
IF RETURNCD = 0
MOVE 'SUCCESSFUL CALL, RETURN DATA IS IN WC-DATA'
TO MSG-DATA
ELSE
MOVE 'PROCESS ERROR OCCURRED, RETURN CODE EQUAL '
TO MSG-DATA
MOVE RETURNCD TO M-RCDE
END-IF.
EXEC CICS SEND TEXT FROM(MSG-AREA) LENGTH(47)
ERASE TERMINAL FREEKB CURSOR(0)
END-EXEC.
A200-EXIT.
EXEC CICS RETURN END-EXEC.
次の例は、CのCICSクライアント・プログラムのサンプルです。
long resp, resp2;
unsigned short int lmsg;
struct CMAREA carea;
carea.CltHdr.DataLen = strlen(sendbuf);
memcpy(carea.CltHdr.SvcName, “ECHO”, 4);
carea.CltHdr.RequestCd = BEA_REQUEST_RESPONSE;
memcpy(carea.Request_data, “This is a test”, 14);
lmsg=sizeof(carea);
/* Use the name defined during installation */
EXEC CICS LINK PROGRAM("PREREQ")
COMMAREA(&carea)
LENGTH(lmsg) RESP(resp) RESP2(resp2);
if(carea.CltHdr.ReturnCd || carea.CltHdr.ReqReturnCd)
process error;
else
successful call, returned data is in Request_data;
注意: | Cプログラマは、文字列の中にNULL終了文字を含めないようにしてください。前述の例では、strxxx 呼出しではなく、memxxx 呼出しを使用しています。この例は、CICS環境でC言語を使用する場合の標準パターンです。詳細は、CICS版C言語のドキュメントを参照してください。 |
TMA TCP for CICSを使用している際に、次の3つのタイプが発生することがあります。
次の項から、これらの各種エラーをTMA TCPがどのように処理しているのかについて説明します。
ローカル・ゲートウェイまたはリモート・ゲートウェイで発生したエラーは、リモートのOracle Tuxedoノード上のULOG
ファイルと、CICSリージョンのBEALOG
ファイル(インストール時に定義されるTDキュー)に記録されます。関連するサービス・リクエストはすべて失敗しますが、TMAゲートウェイ間で相互の通信が可能であれば、エラー・メッセージがTMAゲートウェイ間でやり取りされます。
Oracle Tuxedoドメインからリクエストを送信するときに、送信先のリモート・システム側の問題で、TMA TCP for CICSが特定タイプの障害を検出できない場合は、TMA TCP Gateway(Oracle Tuxedoドメイン)のブロッキング・タイムアウト・パラメータの値を調整すれば、時間設定に応じた問題の検出が可能になります。この構成パラメータはリモートのTMA TCP Gateway・システムで設定します。このパラメータを変更する場合は、そのシステムの管理者に問い合せてください。
CICSリージョンから送信されるリクエストで発生した問題も、BEALOG
ファイルに記録されます。これらのリクエストのタイムアウト時間は、TMA TCP for CICSの管理ツールを使用して調節できます。
ブロッキング・タイムアウト・パラメータの詳細は、『Oracle TMA TCP Gatewayユーザー・ガイド』を参照してください。
プログラムが存在しない、プログラムが無効になっているなどのエラーが発生したため、ハンドラが特定のプログラムを実行できない場合は、ハンドラからTMA TCP Gatewayゲートウェイにメッセージが送信されます。その他のタイプのエラーがアプリケーション・プログラムで発生し、ハンドラに問題が通知されない場合は、ハンドラからリモート・ゲートウェイにタイムアウトのメッセージが送信されます。
リクエストの送信元がCICSである場合、Oracle Tuxedoは可能であれば、具体的な問題に関する情報を戻します。ネットワークに問題があり、データの送信が不可能な場合は、リクエストの送信元にタイムアウト・エラーが戻されます。
次の項で、CICSプログラマがTMA TCP for CICSをサーバーとして相互運用するアプリケーション・プログラムを開発または変更する際に注意する必要がある事項について説明します。
リモートのOracle Tuxedoドメインから送信されるリクエストを処理するCICSアプリケーション・プログラムの記述方法は、CICS LINK
コマンドで起動するCICSアプリケーション・プログラムと似ています。
Oracle Tuxedoのリクエストを適切に処理するCICSプログラムとは、任意の操作を実行したら、情報を呼出し元に戻すプログラムです。Oracle Tuxedoクライアント・プログラムからリクエストされるCICSサービスは、処理するリクエストとレスポンスが必ず1つずつでなければなりません。
Oracle Tuxedoクライアントから呼び出されるCICSサービス・プログラムがEXEC CICS XCTL
操作の実行時にその操作を制御しない場合は、注意が必要です。レスポンス・データがクライアントに確実に戻されるように、XCTLの実行中に、データの受け渡しを行うプログラム間で、元のCOMMAREA
を渡す必要があり、こうすることで、データ受け渡しの最後のプログラムからTMA TCP for CICSのハンドラにレスポンス・データが戻される
ようになります。
クライアントにレスポンスを送信するサービス・プログラムは、EXEC CICS LINK
コマンドを使用して実行します。COMMAREA
オプションにはデータ本体へのポインタが含まれるため、ヘッダーは送信されません。したがって、サービス・プログラムが使用できるデータは、COMMAREA
内のリクエスト・データです。
リクエスタに応答を返さないサービス・プログラムは、EXEC CICS START
コマンドで開始するトランザクションを使用して実行します。このコマンドのFROM
オプションにはデータ本体へのポインタが含まれるため、ヘッダーは送信されません。したがって、このようなサービス・プログラムは、データ本体へのポインタを含むSET
オプションを指定してEXEC CICS RETRIEVE
コマンドを使用する必要があります。
注意: | 応答を送信しないサービスごとに一意のトランザクションを定義し、該当するサービスの着信サービス情報画面のトランザクション名 フィールドにトランザクションの名前を入力してください。 |
応答を送信しないサービスとしては、たとえば、TPNOREPLY
フラグを設定したtpacallを使用して、クライアントからサービスをリクエストする場合があります。
システムがゲートウェイを介して送信する返信メッセージの実際のサイズをリクエスト単位で設定できます。これは単に、着信サービス情報画面の最大メッセージ
・フィールドを使用して、特定のサービスのメッセージ・サイズを制限することとは違います。リクエスト単位で返信メッセージのサイズを制限するには、サービス・プログラムが、コピーブックまたは"YOURHLQ".BEATCPC.INCLUDEファイルに収録されているインクルード・ファイルを使用して、TWAのアドレス指定
を行う必要があります。
リクエスト単位で返信メッセージの長さを変更するには、TWAINCL
ファイルに定義されているTWA_CONNECT
構造体のrtnMsgSize
フィールドでメッセージの長さを指定します。
リクエスト単位で返信メッセージの長さを変更するには、TWACOPY
コピーブックのTWA_CONNECT
レコード型のRTN-MSG-SIZE
フィールドでメッセージの長さを指定します。