|
simpapp は、1 クライアントと 1 サーバで構成される ATMI サンプル アプリケーションです。このアプリケーションは、Oracle Tuxedo ソフトウェアに同梱されています。サーバでは、1 つのサービスだけが実行されます。つまり、クライアントから小文字の英字文字列を受け取り、その文字列を大文字で返します。
ここでは、Oracle Tuxedo の ATMI アプリケーションを開発して実行するための手順を順に示します。次の図は、それらの作業をまとめたものです。各作業をクリックすると、その作業を行う手順が表示されます。
このチュートリアルのサンプル アプリケーションを実行するには、Oracle Tuxedo ATMI のクライアント/サーバ ソフトウェアがインストールされ、ここで説明するファイルやコマンドを使用できることが必要です。既にインストールされている場合は、ソフトウェアのインストール先のディレクトリのパス名 (TUXDIR) を確認する必要があります。また、Oracle Tuxedo ディレクトリ構造内のディレクトリとファイルに読み取りパーミッションと実行パーミッションを設定し、simpapp の各ファイルをコピーしたり、Oracle Tuxedo の各コマンドを実行できるようにします。
ここで説明する simpapp の手順は、UNIX システムに基づいています。UNIX オペレーティング システム環境でのプラットフォーム固有の手順はそのまま適用できますが、simpapp ファイルのコピーや環境変数の設定などの手順は Windows 2003 など UNIX 以外のプラットフォームでは異なる場合があります。このため、チュートリアルで示す例は、お使いのプラットフォームに適さない場合があります。
ここで説明する作業を行うと、ATMI クライアントおよびサーバが実行できるタスクについて理解し、環境に応じてコンフィグレーション ファイルを変更でき、tmadmin を呼び出してアプリケーションの動作を確認できるようになります。つまり、Oracle Tuxedo アプリケーションの基本的な要素 (クライアント プロセス、サーバ プロセス、コンフィグレーション ファイルなど) を理解し、Oracle Tuxedo システムの各コマンドを使用してアプリケーションを管理できるようになります。
| 注意 : | 以下に示す手順は、UNIX システムに基づいています。Windows 2003 など UNIX 以外のプラットフォームでは、手順が異なる場合があります。サンプル アプリケーションで使用されているサンプル コードは、プラットフォームによって内容が異なります。 |
simpapp 用にディレクトリを作成し、そのディレクトリに移動 (cd) します。mkdir simpdir
cd simpdir
| 注意 : | この作業は省略せずに行ってください。この作業を行うと、最初からあった simpapp のファイルと、手順に従って作成したファイルを確認できるようになります。csh を使用せずに、標準シェル (/bin/sh) または Korn シェルを使用してください。 |
TUXDIR=Oracle Tuxedo システムのルート ディレクトリのパス名TUXCONFIG=現在の作業ディレクトリのパス名PATH=$PATH:$TUXDIR/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
export TUXDIR TUXCONFIG PATH LD_LIBRARY_PATH
TUXDIR および PATH を設定して、Oracle Tuxedo ディレクトリ構造内のファイルにアクセスでき、Oracle Tuxedo コマンドを実行できるようにします。Sun Solaris では、PATH の最上位ディレクトリとして /usr/5bin を指定する必要があります。AIX (RS/6000) では、LD_LIBRARY_PATH ではなく LIBPATH を使用します。HP-UX (HP 9000) では、LD_LIBRARY_PATH の代わりに SHLIB_PATH を使用します。
コンフィグレーション ファイルをロードするには、TUXCONFIG を設定する必要があります。詳細については、「ステップ 4 : コンフィグレーション ファイルの編集とロード」を参照してください。
simpapp ファイルをコピーします。 cp $TUXDIR/samples/atmi/simpapp/* .
| 注意 : | 一部のファイルは、後で編集して実行可能ファイルを作成します。そのため、ソフトウェアに同梱のオリジナルのファイルではなく、そのコピーを使用することをお勧めします。 |
$ ls
README env simpapp.nt ubbmp wsimpcl
README.as400 setenv.cmd simpcl.c ubbsimple
README.nt simpapp.mk simpserv.c ubbws
$
| 注意 : | README ファイルのほかに、UNIX システム以外のプラットフォーム用に simp*.* ファイルと ubb* ファイルがあります。README ファイルには、ほかのファイルの説明が記述されています。 |
ATMI クライアント プログラムのソース コードの内容を確認します。
$ more simpcl.c
1 #include <stdio.h>
2 #include "atmi.h" /* TUXEDO */
3
4
5
6
7 #ifdef __STDC__
8 main(int argc, char *argv[])
9
10 #else
11
12 main(argc, argv)
13 int argc;
14 char *argv[];
15 #endif
16
17 {
18
19 char *sendbuf, *rcvbuf;
20 int sendlen, rcvlen;
21 int ret;
22
23 if(argc != 2) {
24 fprintf(stderr, "Usage: simpcl string\n");
25 exit(1);
26 }
27 /* クライアント プロセスとして BEA TUXEDO にアタッチします。 */
28 if (tpinit((TPINIT *) NULL) == -1) {
29 fprintf(stderr, "Tpinit failed\n");
30 exit(1);
31 }
32 sendlen = strlen(argv[1]);
33 if((sendbuf = (char *)tpalloc("STRING", NULL, sendlen+1))== NULL){
34 fprintf(stderr,"Error allocating send buffer\n");
35 tpterm();
36 exit(1);
37 }
38 if((rcvbuf = (char *)tpalloc("STRING", NULL, sendlen+1))== NULL){
39 fprintf(stderr,"Error allocating receive buffer\n");
40 tpfree(sendbuf);
41 tpterm();
42 exit(1);
43 }
44 strcpy(sendbuf, argv[1]);
45 ret = tpcall("TOUPPER", sendbuf, NULL, &rcvbuf, &rcvlen, 0);
46 if(ret == -1) {
47 fprintf(stderr, "Can't send request to service TOUPPER\n");
48 fprintf(stderr, "Tperrno = %d, %s\n", tperrno,
49 tmemsgs[tperrno]);
50 tpfree(sendbuf);
51 tpfree(rcvbuf);
52 tpterm();
53 exit(1);
54 }
55 printf("Returned string is: %s\n", rcvbuf);
56
57 /* バッファを解放し、Oracle TUXEDO からのアタッチを解除します。 */
58 tpfree(sendbuf);
59 tpfree(rcvbuf);
60 tpterm();
61 }
buildclient を実行して、クライアント プログラムをコンパイルします。 buildclient -o simpcl -f simpcl.c
simpcl は出力ファイル、simpcl.c は入力ソース ファイルです。
$ ls -l
total 97
-rwxr-x--x 1 usrid grpid 313091 May 28 15:41 simpcl
-rw-r----- 1 usrid grpid 1064 May 28 07:51 simpcl.c
-rw-r----- 1 usrid grpid 275 May 28 08:57 simpserv.c
-rw-r----- 1 usrid grpid 392 May 28 07:51 ubbsimple
ATMI サーバ プログラムのソース コードの内容を確認します。
$ more simpserv.c
*/
/* #ident "@(#) apps/simpapp/simpserv.c $Revision: 1.1 $" */1#include <stdio.h>2#include <ctype.h>3#include <atmi.h> /* TUXEDO ヘッダ ファイル */4#include <userlog.h> /* TUXEDO ヘッダ ファイル */5/* tpsvrinit は、サーバの起動時 (要求の処理を行う前)
に実行されます。この関数は必須ではありません。
この例では使用されていませんが、サーバの停止時に
呼び出される tpsvrdone も使用できます。
9*/10#if defined(__STDC__) || defined(__cplusplus)12tpsvrinit(int argc, char *argv[])13#else14tpsvrinit(argc, argv)15int argc;16char **argv;17#endif18{19/* argc と argv が使用されないと、コンパイラによる警告メッセージが出力されます。20*/21argc = argc;22argv = argv;23/* userlog は TUXEDO 中央メッセージ ログに書き込みます。 */24userlog("Welcome to the simple server");25return(0);26}27/* この関数は、クライアントから要求された実際のサービスを実行します。
引数には、データ バッファへのポインタ、データ バッファの長さなどを含む構造体を
指定します。30*/31#ifdef __cplusplus32extern "C"33#endif34void35#if defined(__STDC__) || defined(__cplusplus)36TOUPPER(TPSVCINFO *rqst)37#else38TOUPPER(rqst)39TPSVCINFO *rqst;40#endif41{42int i;4344for(i = 0; i < rqst->len-1; i++)45rqst->data[i] = toupper(rqst->data[i]);46/* 転送されたバッファを要求の発信元に返します。*/47tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);48}
buildserver を実行して、ATMI サーバ プログラムをコンパイルします。buildserver -o simpserv -f simpserv.c -s TOUPPER
simpserv は作成される実行ファイル、simpserv.c は入力ソース ファイルです。-s TOUPPER オプションは、サーバの起動時に宣言されるサービスを指定します。
$ ls -l
total 97
-rwxr-x--x 1 usrid grpid 313091 May 28 15:41 simpcl
-rw-r----- 1 usrid grpid 1064 May 28 07:51 simpcl.c
-rwxr-x--x 1 usrid grpid 358369 May 29 09:00 simpserv
-rw-r----- 1 usrid grpid 275 May 28 08:57 simpserv.c
-rw-r----- 1 usrid grpid 392 May 28 07:51 ubbsimple
simpserv という実行可能モジュールが作成されました。
simpapp のコンフィグレーション ファイル ubbsimple の内容を確認します。1$
2
3 # 簡単な BEA Tuxedo アプリケーション用の UBBCONFIG スケルトン ファイルです。
4 # <山かっこで囲まれた文字列> を適切な値で置き換えます。
5 RESOURCES
6 IPCKEY <32,768 よりも大きい IPC キーで置き換えます>
7
8 # 例 :
9
10 #IPCKEY 62345
11
12 MASTER simple
13 MAXACCESSERS 5
14 MAXSERVERS 5
15 MAXSERVICES 10
16 MODEL SHM
17 LDBAL N
18
19 *MACHINES
20
21 DEFAULT:
22
23 APPDIR="<現在のパス名で置き換えます>"
24 TUXCONFIG="<TUXCONFIG のパス名で置き換えます>"
25 TUXDIR="<Tuxedo のルート ディレクトリ (/ 以外) を指定します>"
26 # 例 :
27 # APPDIR="/usr/me/simpdir"
28 # TUXCONFIG="/usr/me/simpdir/tuxconfig"
29 # TUXDIR="/usr/tuxedo"
30
31 <Machine-name> LMID=simple
32 # 例 :
33 #tuxmach LMID=simple
34 *GROUPS
35 GROUP1
36 LMID=simple GRPNO=1 OPENINFO=NONE
37
38 *SERVERS
39 DEFAULT:
40 CLOPT="-A"
41 simpserv SRVGRP=GROUP1 SRVID=1
42 *SERVICES
43 TOUPPER
<string> を適切な値に置き換えます。tmloadcf を実行して、コンフィグレーション ファイルをロードします。$ tmloadcf ubbsimple
TUXCONFIG ファイルを初期化しますか: /usr/me/simpdir/tuxconfig [y, q] ? y
$
$ ls -l
total 216
-rwxr-x--x 1 usrid grpid 313091 May 28 15:41 simpcl
-rw-r----- 1 usrid grpid 1064 May 28 07:51 simpcl.c
-rwxr-x--x 1 usrid grpid 358369 May 29 09:00 simpserv
-rw-r----- 1 usrid grpid 275 May 28 08:57 simpserv.c
-rw-r----- 1 usrid grpid 106496 May 29 09:27 tuxconfig
-rw-r----- 1 usrid grpid 382 May 29 09:26 ubbsimple
TUXCONFIG というファイルが作成されました。TUXCONFIG ファイルは、Oracle Tuxedo システムで制御される新しいファイルです。
tmboot を実行して、アプリケーションを起動します。$ tmboot
すべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスを起動させますか? (y/n): y
/usr/me/simpdir/tuxconfig のすべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスを起動します。
すべての TUXEDO 管理プロセスを起動します。
exec BBL -A:
プロセス ID=24223 を起動しました。
TUXEDO 管理プロセスを起動します。
exec simpserv -A :
プロセス ID=24257 を起動しました。
2 個のプロセスを起動しました。
$
BBL は、アプリケーションの共有メモリをモニタする管理プロセスです。simpserv は、要求を受け取るために継続的に実行している simpapp サーバです。
simpapp を実行するには、クライアントから要求を送信します。
$ simpcl “hello, world”
Returned string is: HELLO, WORLD
システム管理者は tmadmin コマンド インタプリタを使用して、アプリケーションを調べ、動的に変更を加えることができます。tmadmin を実行するには、TUXCONFIG 環境変数を設定する必要があります。
tmadmin を使用すると、50 個以上のコマンドを解釈したり実行することができます。完全なリストについては、「tmadmin(1)」を参照してください。この例では、2 つの tmadmin コマンドを使用します。
| 注意 : | 大なり記号 (>) は、tmadmin のプロンプトです。 |
printserver(psr) コマンドを入力して、サーバに関する情報を出力します。> psr
a.out 名 キュー名 グループ名 ID 要求終了 ロード終了 現サービス
---------- ---------- -------- -- ------ --------- ---------------
BBL 531993 simple 0 0 0 ( IDLE )
simpserv 00001.00001 GROUP1 1 0 0 ( IDLE )
>
printservice(psc) コマンドを入力して、サービスに関する情報を出力します。 > psc
サービス名 ルーチン名 a.out 名 グループ名 ID マシン 終了数 状態
------------ ------------ ---------- -------- -- ------- ------ ------
TOUPPER TOUPPER simpserv GROUP1 1 simple - AVAIL
>
tmshutdown を実行して、アプリケーションを停止します。$ tmshutdown
すべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスをシャットダウンさせますか?(y/n): y
/usr/me/simpdir/tuxconfig のすべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスをシャットダウンします。
アプリケーションのサーバ・プロセスをシャットダウンします。
サーバ ID = 1 グループ ID = GROUP1 マシン = simple: シャットダウンしました。
管理プロセスをシャットダウンします。
サーバ Id = 0 グループ Id = simple マシン = simple: シャットダウンしました。
2 個のプロセスが終了しました。
$
ULOG の内容を確認します。$ cat ULOG*
$
113837.tuxmach!tmloadcf.10261: CMDTUX_CAT:879: 新しいファイル・システムが作成されました。(サイズ = 32 4096-バイトブロック)
113842.tuxmach!tmloadcf.10261: CMDTUX_CAT:871: TUXCONFIG ファイル /usr/me/simpdir/tuxconfig が作成されました。
113908.tuxmach!BBL.10768: LIBTUX_CAT:262: サーバの main() が起動しました。
113913.tuxmach!simpserv.10925: LIBTUX_CAT:262: サーバの main() が起動しました。
113913.tuxmach!simpserv.10925: Welcome to the simple server
114009.tuxmach!simpserv.10925: LIBTUX_CAT:522: デフォルトの tpsvrdone() 関数が使われました。
114012.tuxmach!BBL.10768: CMDTUX_CAT:26: システムを終了します。
|