bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

C 言語を使用した Tuxedo アプリケーションのプログラミング

 Previous Next Contents View as PDF  

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

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

 


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

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

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

int
tpinit (TPINIT *tpinfo)

クライアントが tpinit() 関数を呼び出す前にサービス要求 (または ATMI 関数) を呼び出すと、暗黙的にアプリケーションに参加したことになります。その場合、tpinfo 引数が NULL に設定されて、tpinit() 関数がクライアントではなく BEA Tuxedo システムによって呼び出されます。tpinfo 引数は、タイプが TPINIT、サブタイプが NULL の型付きバッファを指します。TPINIT 型バッファは atmi.h ヘッダ・ファイルに定義されており、次の情報が格納されています。

char usrname[MAXTIDENT+2]; 
char
cltname[MAXTIDENT+2];
char
passwd[MAXTIDENT+2];
char
grpname[MAXTIDENT+2];
long
flags;
long
datalen;
long
data;

次の表は、TPINIT データ構造体のフィールドを示しています。

表 4-1 TPINIT データ構造体のフィールド

フィールド

説明

usrname

クライアントを表す名前。ブロードキャスト通知と管理統計情報の検索に使用されます。クライアントは、tpinit() 関数を呼び出すときに usrname に値を設定します。この値には、最大文字数が MAXTIDENT で、最後が NULL で終わる文字列を指定します。最大文字数のデフォルト値は 30 ですが、管理者が変更できます。

cltname

アプリケーション定義のセマンティクスに従ったクライアント名。30 文字以内で最後が NULL で終わる文字列を指定します。ブロードキャスト通知と管理統計情報の検索に使用されます。クライアントは、tpinit() 関数を呼び出すときに cltname に値を設定します。この値には、最大文字数が MAXTIDENT で、最後が NULL で終わる文字列を指定します。最大文字数のデフォルト値は 30 ですが、管理者が変更できます。

注記 sysclient の値は、cltname フィールド用に予約されています。

passwd

非暗号化形式のアプリケーション・パスワード。ユーザ認証に使用されます。30 文字以内の文字列を指定します。

grpname

クライアントをリソース・マネージャ・グループに対応付ける値。grpname が長さ 0 の文字列として設定されている場合、クライアントはリソース・マネージャに対応付けられず、デフォルトのクライアント・グループに属します。ワークステーション・クライアントの場合、grpname の値には NULL 文字列 (長さが 0 の文字列) を指定します。ワークステーション・クライアントの詳細については、『BEA Tuxedo Workstation コンポーネント』を参照してください。

flags

クライアント固有の通知メカニズム、およびシステム・アクセスのモード。この値により、マルチコンテキスト・モードとシングルコンテキスト・モードが制御されます。フラグの詳細については、任意通知型通知の処理、または『BEA Tuxedo C リファレンス』の tpinit() を参照してください。

datalen

アプリケーション固有データの長さ。TPINIT 型バッファのバッファ・タイプ・スイッチ・エントリは、そのバッファに渡される合計サイズに基づいてこのフィールドを設定します。アプリケーション・データのサイズは、合計サイズから TPINIT 構造体自体のサイズを差し引き、その値に構造体に定義されているデータ・プレースホルダのサイズを加算したものです。

data

アプリケーション定義の認証サービスに転送される可変長データ用のプレース・ホルダ。

クライアント・プログラムは、アプリケーションに参加する前に tpalloc() を呼び出して TPINIT バッファを割り当てる必要があります。次のコード例は、TPINIT バッファを割り当て、そのバッファを使用してアプリケーション固有の 8 バイトのデータを tpinit() 関数に渡す方法を示しています。

コード リスト 4-1 TPINIT 型バッファの割り当て

.
.
.
TPINIT *tpinfo;
.
.
.
if ((tpinfo = (TPINIT *)tpalloc("TPINIT",(char *)NULL,
TPINITNEED(8))) == (TPINIT *)NULL){
Error Routine
}

TPINIT 型バッファの詳細については、『BEA Tuxedo C リファレンス』の tpinit() を参照してください。

関連項目

 


TPINIT 型バッファの機能

次の TPINIT 型バッファの機能をクライアントで利用するには、tpinit() 関数を明示的に呼び出す必要があります。

クライアント命名

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

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

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

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

任意通知型メッセージの送受信の詳細については、イベント・ベースのクライアントおよびサーバのコーディングを参照してください。tmadmin(1) の詳細については、『BEA Tuxedo C リファレンス』を参照してください。

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

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


 

任意通知型通知の処理

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

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

ディップ・インでは、メッセージの到着を確認するまでの間隔が長い場合があります。そのため、アプリケーションで tpchkunsol() 関数を呼び出して、既に到着している任意通知型メッセージがないかどうかを確認できます。tpchkunsol() 関数の詳細については、イベント・ベースのクライアントおよびサーバのコーディングを参照してください。

クライアントが tpinit() 関数を使用してアプリケーションに参加する場合、フラグを定義して任意通知型メッセージの処理方法を指定できます。クライアントへの通知では、次の表に示す値を flags に指定できます。

表 4-2 TPINIT 型バッファのクライアント通知でのフラグ

フラグ

説明

TPU_SIG

シグナルによる任意通知を選択します。このフラグは、シングル・スレッドでシングル・コンテキストのアプリケーションのみで使用します。このモードの利点は、直ちに通知できることです。このモードには、次のような不都合があります。

システムや環境の要件を満たしていない場合にこのフラグを指定すると、フラグに TPU_DIP が設定され、ログにイベントが記録されます。

TPU_DIP (デフォルト)

ディップ・インを使用した任意通知型メッセージを指定します。クライアントは tpchkunsol() 関数を使用してメッセージ処理関数の名前を指定し、tpsetunsol() 関数を使用して待機中の任意通知型メッセージを確認できます。

TPU_THREAD

別のスレッド内の THREAD 通知を指定します。このフラグは、マルチスレッドをサポートするプラットフォーム専用です。マルチスレッドがサポートされていないプラットフォームで TPU_THREAD を指定すると、無効な引数として処理されます。その結果、tperrno(5) エラーが返されて TPEINVAL が設定されます。

TPU_IGN

任意通知を無視します。

TPINIT 型バッファ・フラグの詳細については、『BEA Tuxedo C リファレンス』の tpinit(3c) を参照してください。

システム・アクセス・モード

An application can access the BEA Tuxedo system through either of two modes: protected or fastpath.クライアントは、tpinit() 関数を使用してアプリケーションに参加するときに、モードを要求できます。モードを指定するには、TPINIT バッファの flags フィールドにいずれかのモードを指定して、その値を tpinit() 関数に渡します。

表 4-3 TPINIT 型バッファのシステム・アクセス・フラグ

モード

説明

PROTECTED

アプリケーション内で ATMI 関数を呼び出し、共用メモリを使用して BEA Tuxedo システムの内部テーブルにアクセスします。BEA Tuxedo システム・ライブラリ外のアプリケーション・コードからのアクセスに対して、共用メモリを保護します。この値は、NO_OVERRIDE が指定されている場合を除き、UBBCONFIG の値に優先します。UBBCONFIG の詳細については、『BEA Tuxedo アプリケーションの設定』を参照してください。

FASTPATH (デフォルト)

アプリケーション・コード内で ATMI 関数を呼び出し、共用メモリを使用して BEA Tuxedo システム内部にアクセスします。BEA Tuxedo システム・ライブラリ外のアプリケーション・コードからのアクセスに対して、共用メモリを保護しません。この値は、NO_OVERRIDE が指定されている場合を除き、UBBCONFIG の値に優先します。UBBCONFIG の詳細については、『BEA Tuxedo アプリケーションの設定』を参照してください。

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

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

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

クライアント認証

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

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

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

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

tpchkauth(3c) 関数を使用すると、次の内容を確認できます。

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

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

 


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

クライアントがすべてのサービスを要求して、それに対する応答を受信したら、tpterm(3c) 関数を使用してアプリケーションから分離できます。tpterm() 関数には引数がなく、エラー時には -1 を返します。

 


クライアントのビルド

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

buildclient filename.c -o filename -f filenames -l filenames

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

表 4-4 buildclient のオプション

オプションまたは引数 . .

説明 . .

filename.c

コンパイルする C 言語のアプリケーション。

-o filename

実行可能な出力ファイル。出力ファイルのデフォルト名は a.out です。

-f filenames

BEA Tuxedo システムのライブラリより先にリンクされるファイルのリスト。-f オプションは、コマンド行で複数回指定できます。また、各 -f に複数のファイル名を指定できます。C プログラム・ファイル (file.c) を指定すると、リンクされる前にコンパイルが行われます。ほかのオブジェクト・ファイル (file.o) を個別に、またはアーカイブ・ファイル (file.a) にまとめて指定することもできます。

-l filenames

BEA Tuxedo システム・ライブラリの後にリンクされるファイルのリスト。-l オプションは、コマンド行で複数回指定できます。また、各 -l に複数のファイル名を指定できます。C プログラム・ファイル (file.c) を指定すると、リンクされる前にコンパイルが行われます。ほかのオブジェクト・ファイル (file.o) を個別に、またはアーカイブ・ファイル (file.a) にまとめて指定することもできます。

-r

実行可能サーバにリンクされるリソース・マネージャのアクセス・ライブラリ。アプリケーション管理者は、buildtms(1) コマンドを使用して、すべての有効なリソース・マネージャ情報を $TUXDIR/updataobj/RM ファイルに事前に定義しておく必要があります。指定できるリソース・マネージャは 1 つだけです。詳細については、『BEA Tuxedo アプリケーションの設定』を参照してください。

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

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

デフォルトでは、buildclient コマンドは UNIX の cc コマンドを呼び出します。環境変数 CC を指定して別のコンパイル・コマンドを指定したり、CFLAGS を指定してコンパイル・フェーズやリンク・フェーズにフラグを設定することができます。詳細については、環境変数の設定を参照してください。

buildclient -C -o audit -f audit.o

次のコマンド行の例では、C プログラム audit.c をコンパイルして、実行可能ファイル audit を生成しています。

buildclient -o audit -f audit.c

関連項目

 


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

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

コード リスト 4-2 クライアント・プロセスのパラダイム

main()
{
セキュリティ・レベルをチェック
tpsetunsol() を呼び出して、TPU_DIP 用にハンドラを命名
usrname、cltname を取得
アプリケーション・パスワードの入力を要求
TPINIT バッファを割り当て
TPINIT バッファ構造体メンバに値を格納

if (tpinit((TPINIT *) tpinfo) == -1){
エラー・ルーチン;
}

ユーザ入力が存在する間に
メッセージ・バッファを割り当て {
ユーザ入力をバッファに格納
サービス呼び出しを行う
応答を受信
任意通知型メッセージを確認
}
バッファを解放
.. .
if (tpterm() == -1){
エラー・ルーチン;
}
}

エラーが発生すると -1 が返され、アプリケーションが外部グローバル変数 tperrno にエラーの原因を示す値を設定します。tperrno は、atmi.h ヘッダ・ファイルに定義されています。詳細については、『BEA Tuxedo のファイル形式とデータ記述方法』の tperrno(5) を参照してください。通常、プログラマが発生したエラーの種類を示すエラー コードをこのグローバル変数に設定します。tperrno の値については、システム・エラーを参照してください。各 ATMI 呼び出しで返される全エラー・コードのリストについては、『BEA Tuxedo C リファレンス』の「C 言語アプリケーション・トランザクション・モニタ・インターフェイスについて」を参照してください。

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

コード リスト 4-3 アプリケーションへの参加と分離

#include <stdio.h>         /* UNIX */
#include <string.h> /* UNIX */
#include <fml.h> /* BEA Tuxedo システム */
#include <atmi.h> /* BEA Tuxedo システム */
#include <Uunix.h> /* BEA Tuxedo システム */
#include <userlog.h> /* BEA Tuxedo システム */
#include "bank.h" /* 銀行業務アプリケーションのマクロ定義 */
#include "aud.h" /* 銀行業務アプリケーションの VIEW 定義 */

...

main(argc, argv)
int argc;
char *argv[];

{
...
if (strrchr(argv[0],'/') != NULL)
proc_name = strrchr(argv[0],'/')+1;
else
proc_name = argv[0];
...
/* アプリケーションへの参加 */
if (tpinit((TPINIT *) NULL) == -1) {
(void)userlog("%s:failed to join application¥n", proc_name);
exit(1);
}
...
/* アプリケーションからの分離 */
if (tpterm() == -1) {
(void)userlog("%s:failed to leave application¥n", proc_name);
exit(1);
}
}

この例は、tpinit() を呼び出すことによって、アプリケーションに参加しているクライアント・プロセスを示しています。エラー (戻り値が -1) が発生すると、このプロセスは C プログラム文の printf() と似た引数を取る userlog() を呼び出して、中央イベント・ログにメッセージを書き込みます。詳細については、『BEA Tuxedo C リファレンス』の userlog(3c) を参照してください。

同様に、tpterm() を呼び出し、エラーが発生すると、このプロセスは中央イベント・ログにメッセージを書き込みます。

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy