COBOL を使用した Oracle Tuxedo アプリケーションのプログラミング

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

クライアントのコーディング

ここでは、以下の内容について説明します。

 


アプリケーションへの参加

クライアントがサービスを要求する場合、Oracle Tuxedo アプリケーションに明示的または暗黙的に参加している必要があります。アプリケーションに参加すると、クライアントは要求を送り、その応答を受け取ることができるようになります。

クライアントが明示的にアプリケーションに参加するには、次の文法を指定して TPINITIALIZE(3cbl) を呼び出します。

01 TPINFDEF-REC.
COPY TPINFDEF.
01 USER-DATA-REC PIC X(any-length).
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPINITIALIZE" USING TPINFDEF-REC USER-DATA-REC TPSTATUS-REC.

クライアントが TPINITIALIZE を呼び出す前にサービス要求 (または ATMI 呼び出し) を行うと、暗黙的にアプリケーションに参加したことになります。その場合、SPACES パラメータを使用して、TPINITIALIZE がクライアントではなく Oracle Tuxedo システムによって呼び出されます。TPINFDEF-REC レコードは Oracle Tuxedo システムの特別な型付きレコードであり、クライアントがアプリケーションに参加するときに、クライアントの ID と認証の情報をシステムに渡すためにクライアント プログラムによって使用されます。このレコードは、次のように COBOL の COPY ファイルに定義されています。

05 USRNAME           PIC X(30).
05 CLTNAME PIC X(30).
05 PASSWD PIC X(30).
05 GRPNAME PIC X(30).
05 NOTIFICATION-FLAG PIC S9(9) COMP-5.
88 TPU-SIG VALUE 1.
88 TPU-DIP VALUE 2.
88 TPU-IGN VALUE 3.
05 ACCESS-FLAG PIC S9(9) COMP-5.
88 TPSA-FASTPATH VALUE 1.
88 TPSA-PROTECTED VALUE 2.
05 DATALEN PIC S9(9) COMP-5.

次の表は、COBOL の COPY ファイルに定義されているフィールドを示しています。

表 4-1 COBOL の COPY ファイルのフィールド
フィールド
説明
USRNAME
呼び出し側を表す名前。このフィールドには、UNIX コマンドの getuid(2) の戻り値を指定することもできます。USRNAME には、MAXTIDENT で指定された文字数 (30 文字) までの値を指定できます。
CLTNAME
アプリケーション定義のセマンティクスに従ったクライアント名。CLTNAME には、MAXTIDENT で指定された文字数 (30 文字) までの値を指定できます。
PASSWD
非暗号化形式のアプリケーション パスワード。TUXCONFIG ファイルに格納されたアプリケーション パスワードとの認証で、TPINITIALIZE によって使用されます。PASSWD には、MAXTIDENT の値までの文字列を指定します。
GRPNAME
クライアントを対応付けるリソース マネージャ グループの名前。クライアントは、グローバル トランザクションの一部として、XA 準拠のリソース マネージャにアクセスできるようになります。GRPNAME には、MAXTIDENT で指定された文字数 (30 文字) までの値を指定できます。ただし、現在のところ、GRPNAMESPACES として渡す必要があります。その場合、クライアントはリソース マネージャ グループに対応付けられず、デフォルトのクライアント グループに属することを指定します。
NOTIFICATION-FLAG
使用する通知メカニズム、およびシステム アクセス モード。有効な値については、「非請求通知の処理」を参照してください。
ACCESS-FLAG
使用するシステム アクセス モード。使用できる値については、「システム アクセス モード」を参照してください。
DATALEN
認証サービスに送信されるアプリケーション固有データの長さ。ネイティブ クライアントの場合、このデータはシステムによってエンコードされずに、クライアントによって提供される認証サービスに渡されます。ワークステーション クライアントの場合、クライアント認証はシステムによって行われ、暗号化形式でネットワークを介して渡されます。

TPINITIALIZE が呼び出されると、USRNAMECLTNAME フィールドはクライアント プロセスに対応付けられます。この 2 つのフィールドは、ブロードキャスト通知と管理統計情報の取得に使用されます。

関連項目

 


TPINFDEF-REC レコードの機能

次の TPINFDEF-REC レコードの機能を ATMI クライアントで利用するには、TPINITIALIZE を明示的に呼び出す必要があります。

クライアントの名前付け

クライアントがアプリケーションに参加すると、Oracle Tuxedo システムによってユニークなクライアント識別子が割り当てられます。識別子は、クライアントによって呼び出される各サービスに渡されます。識別子は、非請求通知に使用することもできます。

ユニークなクライアント名とユーザ名をそれぞれ 30 文字以内で割り当てることもできます。その場合、TPINFDEF-REC レコードを使用して名前を TPINITIALIZE に渡します。Oracle Tuxedo システムでは、各プロセスに対応付けられているクライアント名とユーザ名、およびプロセスが実行されているマシンの論理マシン ID (LMID) を組み合わせることにより、そのプロセスに対してユニークな識別子が使用されます。これらのフィールド値を取得する方法は選択することができます。

注意 : プロセスがアプリケーションの管理ドメイン以外で実行されている場合 (つまり、管理ドメインに接続されたワークステーション上で実行されている場合)、アプリケーションにアクセスするためにワークステーション クライアントで使用されているマシンの LMID が割り当てられます。

クライアント プロセスに対してユニークな識別子が作成されると、次の操作を行うことができます。

非請求メッセージの送受信の詳細については、「イベント ベースのクライアントおよびサーバのコーディング」を参照してください。tmadmin(1) の詳細については、『Tuxedo コマンド リファレンス』を参照してください。

次の図は、アプリケーションにアクセスするクライアントに名前を割り当てる方法を示しています。この例では、ジョブ関数を示す cltname フィールドがアプリケーションで使用されています。

図 4-1 クライアントの名前付け

クライアントの名前付け

非請求通知の処理

非請求通知とは、クライアントが予期していないサービス要求に対する応答 (またはエラー コード) を受け取る通信です。たとえば、管理者が 5 分後にシステムを停止することを通知するメッセージをブロードキャストした場合などです。

クライアントに非請求メッセージを通知する方法は数多くあります。たとえば、オペレーティング システムがクライアントにシグナルを送って、クライアントの現在の処理を中断させる方法があります。Oracle Tuxedo システムでは、ATMI 呼び出しが行われるたびに非請求メッセージが到着していないかどうかがデフォルトで確認されます。これはディップ インと呼ばれる方法で、次の利点があります。

「ディップ イン」では、メッセージの到着を確認するまでの間隔が長い場合があります。そのため、アプリケーションで TPCHKUNSOL を呼び出して、既に到着している非請求メッセージがないかどうかを確認できます。TPCHKUNSOL 呼び出しの詳細については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「イベント ベースのクライアントおよびサーバのコーディング」を参照してください。

クライアントが TPINITIALIZE を使用してアプリケーションに参加する場合、フラグを定義して非請求メッセージの処理方法を指定できます。クライアントへの通知では、次の表に示す値を NOTIFICATION-FLAG に指定できます。

表 4-2 TPINFDEF-REC レコードのクライアント通知でのフラグ
フラグ
説明
TPU_SIG
シグナルによる任意通知を選択します。このフラグは、シングル スレッドでシングル コンテキストのアプリケーションのみで使用します。このモードの利点は、直ちに通知できることです。このモードには、次のような不都合があります。
  • ネイティブ クライアントを実行している場合、呼び出し側プロセスで送信側プロセスと同じ UID を使用する必要があります。ワークステーション クライアントには、この制約はありません。
  • すべてのプラットフォーム上で TPU_SIG が使用できるわけではありません。特に、MS-DOS ワークステーションでは使用できません。
システムや環境の要件を満たしていない場合にこのフラグを指定すると、フラグに TPU_DIP が設定され、ログにイベントが記録されます。
TPU_DIP (デフォルト)
ディップ インを使用した非請求メッセージを指定します。クライアントは TPSETUNSOL 呼び出しを使用してメッセージ処理ルーチンの名前を指定し、TPCHKUNSOL 呼び出しを使用して待機中の非請求メッセージを確認できます。
TPU_THREAD
別のスレッド内の THREAD 通知を指定します。このフラグは、マルチスレッドをサポートするプラットフォーム専用です。マルチスレッドがサポートされていないプラットフォームで TPU_THREAD を指定すると、無効な引数として処理されます。その結果、エラーが返されて、TP-STATUSTPEINVAL が設定されます。
TPU_IGN
任意通知を無視します。

TPINFDEF-REC フラグの詳細については、『Tuxedo COBOL リファレンス』の「TPINITIALIZE(3cbl)」を参照してください。

システム アクセス モード

アプリケーションは、protected または fastpath のいずれかのモードで Oracle Tuxedo システムにアクセスできます。クライアントは、TPINITIALIZE を使用してアプリケーションに参加するときに、モードを要求できます。モードを指定するには、TPINFDEF-REC レコードの ACCESS-FLAG フィールドに次のいずれかのモードを指定して、その値を TPINITIALIZE に渡します。

表 4-3 TPINFDEF-REC レコードのシステム アクセス フラグ
モード
説明
TPSA-PROTECTED
アプリケーション内で ATMI 関数を呼び出し、共用メモリを使用して Oracle Tuxedo システムの内部テーブルにアクセスします。Oracle Tuxedo システム ライブラリ外のアプリケーション コードからのアクセスに対して、共用メモリを保護します。この値は、NO_OVERRIDE が指定されている場合を除き、UBBCONFIG の値に優先します。UBBCONFIG の詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。
TPSA-FASTPATH (デフォルト)
アプリケーション コード内で ATMI 関数を呼び出し、共用メモリを使用して Oracle Tuxedo システム内部にアクセスします。Oracle Tuxedo システム ライブラリ外のアプリケーション コードからのアクセスに対して、共用メモリを保護しません。この値は、NO_OVERRIDE が指定されている場合を除き、UBBCONFIG の値に優先します。UBBCONFIG の詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

リソース マネージャとの対応付け

アプリケーション管理者は、リソース マネージャに対応付けられたサーバ (トランザクションを調整するための管理プロセスを提供するサーバを含む) をグループ化できます。グループの定義については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

アプリケーションに参加している場合、クライアントは TPINFDEF-RECgrpname フィールドにグループ名を指定して、特定のグループに参加できます。

クライアント認証

Oracle Tuxedo システムでは、オペレーティング システムのセキュリティ、アプリケーション パスワード、ユーザ認証、省略可能なアクセス制御リスト、必須のアクセス制御リスト、リンク レベルの暗号化などのセキュリティ レベルを設定できます。セキュリティ レベル設定の詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

セキュリティ レベルとしてアプリケーション パスワードが設定されている場合、アプリケーションに参加するときに、すべてのクライアントがアプリケーション パスワードを入力する必要があります。管理者はアプリケーション パスワードを設定したり変更できます。また、そのパスワードを有効なユーザに提供する必要があります。

このレベルのセキュリティが設定されていると、Oracle Tuxedo システムで提供される ud(1) などのクライアント プログラムでは、アプリケーション パスワードの入力が求められます。ud、wud(1) の詳細については、『Oracle Tuxedo アプリケーション実行時の管理』を参照してください。アプリケーション固有のクライアント プログラムには、ユーザからパスワードを取得するコードが記述されていることが必要です。クライアントがアプリケーションに参加するために TPINITIALIZE を呼び出すと、非暗号化パスワードが TPINFDEF-REC レコードに格納されて評価されます。

注意 : パスワードは画面には表示されません。

TPCHKAUTH(3cbl) を使用すると、次の内容を確認できます。

通常、クライアントは TPINITIALIZE より先に TPCHKAUTH を呼び出して、初期化時に指定する必要のあるセキュリティ情報を確認します。

セキュリティのプログラミング手法の詳細については、『Tuxedo CORBA アプリケーションのセキュリティ機能』を参照してください。

 


アプリケーションからの分離

クライアントがすべてのサービスを要求して、それに対する応答を受信したら、TPTERM(3cbl) を使用してアプリケーションから分離できます。TPTERM の呼び出しには、次の文法を使用します。

01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPTERM" USING TPSTATUS-REC.

 


クライアントのビルド

実行可能クラアイントをビルドするには、buildclient(1) コマンドを実行して、Oracle Tuxedo システム ライブラリとそのほかのすべての参照ファイルを使用してアプリケーションをコンパイルします。COBOL プログラムをコンパイルするには、-C オプションを指定します。次は、buildclient コマンドの構文です。

buildclient -C filename.cbl -o filename -f filenames -l filenames

次の表は、buildclient コマンドのオプションを示しています。

表 4-4 buildclient のオプション
オプションまたは引数
説明
filename.cbl
コンパイルする COBOL 言語のアプリケーション。
-o filename
実行可能な出力ファイル。出力ファイルのデフォルト名は a.out です。
-f filenames
Oracle Tuxedo システムのライブラリより先にリンクされるファイルのリスト。-f オプションは、コマンドラインで複数回指定できます。また、各 -f に複数のファイル名を指定できます。COBOL プログラム ファイル (file.cbl) を指定すると、リンクされる前にコンパイルが行われます。ほかのオブジェクト ファイル (file.o) を個別に、またはアーカイブ ファイル (file.a) にまとめて指定することもできます。
-l filenames
Oracle Tuxedo システム ライブラリの後にリンクされるファイルのリスト。-l オプションは、コマンドラインで複数回指定できます。また、各 -l に複数のファイル名を指定できます。COBOL プログラム ファイル (file.cbl) を指定すると、リンクされる前にコンパイルが行われます。ほかのオブジェクト ファイル (file.o) を個別に、またはアーカイブ ファイル (file.a) にまとめて指定することもできます。
-r
実行可能サーバにリンクされるリソース マネージャのアクセス ライブラリ。アプリケーション管理者は、buildtms(1) コマンドを使用して、すべての有効なリソース マネージャ情報を $TUXDIR/updataobj/RM ファイルに事前に定義しておく必要があります。指定できるリソース マネージャは 1 つだけです。詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

注意 : Oracle Tuxedo ライブラリは自動的にリンクされます。コマンドラインに Oracle Tuxedo ライブラリを指定する必要はありません。

リンクするライブラリ ファイルの指定順序は重要です。関数を呼び出す順序と、それらの関数への参照を含むライブラリによって、この順序が決定されます。

デフォルトでは、buildclient コマンドは UNIX の cc コマンドを呼び出します。環境変数 ALTCC を指定して別のコンパイル コマンドを指定したり、ALTCFLAGS を指定してコンパイル フェーズやリンク フェーズにフラグを設定することができます。ALTCC は、デフォルトでは、MicroFocus Net Express を使用する cobcc に設定されます。Fujitsu NetCOBOL を使用するためには、Windows システムでも ALTCC を設定しなければなりません。NetCOBOL 用に ALTCC=cobcc85 を設定する必要があります。詳細については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「環境変数の設定」を参照してください。

注意 : Windows システムでは、ALTCC および ALTCFLAGS 環境変数は使用できません。これらの変数を設定すると、予想外の結果が生じます。アプリケーションをコンパイルするには、最初に COBOL コンパイラを使用し、次に生成されたオブジェクト ファイルを buildclient コマンドに渡す必要があります。次に例を示します。
注意 : buildclient -C -o audit -f audit.o
注意 : 次のコマンドラインの例では、COBOL プログラム audit.cbl をコンパイルして、実行可能ファイル audit を生成しています。
注意 : buildclient -C – o audit – f audit.cbl

関連項目

 


クライアント プロセスの例

次の擬似コードは、通常のクライアント プロセスがアプリケーションに参加してから分離するまでの処理を示しています。

コード リスト 4-1 クライアント プロセスのパラダイム
. . .
Check level of security
CALL TPSETUNSOL to name your handler routine for TPU-DIP
get USRNAME, CLTNAME
prompt for application PASSWD
SET TPU-DIP TO TRUE.
CALL "TPINITIALIZE" USING TPINFDEF-REC
USER-DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
. . .
make service call
receive the reply
check for unsolicited messages
. . .
CALL "TPTERM" USING TPSTATUS-REC.
IF NOT TPOK
error processing
. . .
EXIT PROGRAM.

この例では、TPINITIALIZE は次の 3 つの引数を取ります。

TPINITIALIZETPTERM は、呼び出しが成功すると、TP-STATUS IN TPSTATUS-REC に [TPOK] を返します。いずれのコマンドでもエラーが検出されると、コマンドは失敗し、エラーの原因を示す値が TP-STATUS に設定されます。TPSTATUS-REC は、COBOL の COPY ファイルに定義されています。TP-STATUS の値については、『C 言語を使用した Oracle Tuxedo アプリケーションのプログラミング』の「エラーの管理」を参照してください。各 ATMI 呼び出しで返される全エラー コードのリストについては、『Tuxedo COBOL リファレンス』の「COBOL アプリケーション トランザクション モニタ インタフェースの紹介」を参照してください。

次の例は、TPINITIALIZETPTERM ルーチンの使用方法を示しています。このサンプル コードは、Oracle Tuxedo ソフトウェアに提供されている銀行業務のサンプル アプリケーション bankapp から引用したものです。

コード リスト 4-2 アプリケーションへの参加と分離
IDENTIFICATION DIVISION.
PROGRAM-ID. FIG1-3.
AUTHOR. TUXEDO DEVELOPMENT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
*
WORKING-STORAGE SECTION.
*****************************************************
* Tuxedo の定義
*****************************************************
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPINFDEF-REC.
COPY TPINFDEF.
*****************************************************
* ログ メッセージの定義
*****************************************************
01 LOGMSG.
05 FILLER PIC X(10) VALUE "FIG12-3 =>".
05 LOGMSG-TEXT PIC X(50).
01 LOGMSG-LEN PIC S9(9) COMP-5.
*
01 USER-DATA-REC PIC X(75).
******************************************************
PROCEDURE DIVISION.
START-HERE.
MOVE LENGTH OF LOGMSG TO LOGMSG-LEN.
*****************************************************
* システムへのクライアントの登録
*****************************************************
MOVE SPACES TO USRNAME.
MOVE SPACES TO CLTNAME.
MOVE SPACES TO PASSWD.
MOVE SPACES TO GRPNAME.
MOVE ZERO TO DATALEN.
SET TPU-DIP TO TRUE.
*
CALL "TPINITIALIZE" USING TPINFDEF-REC
USER-DATA-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "TPINITIALIZE FAILED" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM.
*****************************************************
* アプリケーション固有のコード
*****************************************************
. . .
*****************************************************
*アプリケーションからの分離
*****************************************************
CALL "TPTERM" USING TPSTATUS-REC.
IF NOT TPOK
MOVE "TPTERM FAILED" TO LOGMSG-TEXT
PERFORM DO-USERLOG.
EXIT-PROGRAM.
STOP RUN.
*****************************************************
* ユーザ ログにメッセージを記録
*****************************************************
DO-USERLOG.
CALL "USERLOG" USING LOGMSG
LOGMSG-LEN
TPSTATUS-REC.

この例は、TPINITIALIZE を呼び出すことによって、アプリケーションに参加しているクライアント プロセスを示しています。エラーが発生すると、USERLOG を呼び出して、中央イベント ログにメッセージを書き込みます。


  ページの先頭       前  次