サンプルを使用した Oracle Tuxedo アプリケーションの開発方法

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

simpapp (簡単な C 言語アプリケーション) のチュートリアル

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

 


simpapp とは

simpapp は、1 クライアントと 1 サーバで構成される ATMI サンプル アプリケーションです。このアプリケーションは、Oracle Tuxedo ソフトウェアに同梱されています。サーバでは、1 つのサービスだけが実行されます。つまり、クライアントから小文字の英字文字列を受け取り、その文字列を大文字で返します。

 


simpapp のファイルおよびリソースの準備

ここでは、Oracle Tuxedo の ATMI アプリケーションを開発して実行するための手順を順に示します。次の図は、それらの作業をまとめたものです。各作業をクリックすると、その作業を行う手順が表示されます。

図 2-1 simpapp の開発プロセス

simpapp の開発プロセス

はじめに

このチュートリアルのサンプル アプリケーションを実行するには、Oracle Tuxedo ATMI のクライアント/サーバ ソフトウェアがインストールされ、ここで説明するファイルやコマンドを使用できることが必要です。既にインストールされている場合は、ソフトウェアのインストール先のディレクトリのパス名 (TUXDIR) を確認する必要があります。また、Oracle Tuxedo ディレクトリ構造内のディレクトリとファイルに読み取りパーミッションと実行パーミッションを設定し、simpapp の各ファイルをコピーしたり、Oracle Tuxedo の各コマンドを実行できるようにします。

このチュートリアルについて

ここで説明する simpapp の手順は、UNIX システムに基づいています。UNIX オペレーティング システム環境でのプラットフォーム固有の手順はそのまま適用できますが、simpapp ファイルのコピーや環境変数の設定などの手順は Windows 2003 など UNIX 以外のプラットフォームでは異なる場合があります。このため、チュートリアルで示す例は、お使いのプラットフォームに適さない場合があります。

このチュートリアルの目的

ここで説明する作業を行うと、ATMI クライアントおよびサーバが実行できるタスクについて理解し、環境に応じてコンフィグレーション ファイルを変更でき、tmadmin を呼び出してアプリケーションの動作を確認できるようになります。つまり、Oracle Tuxedo アプリケーションの基本的な要素 (クライアント プロセス、サーバ プロセス、コンフィグレーション ファイルなど) を理解し、Oracle Tuxedo システムの各コマンドを使用してアプリケーションを管理できるようになります。

 


ステップ 1 : simpapp ファイルのコピー

注意 : 以下に示す手順は、UNIX システムに基づいています。Windows 2003 など UNIX 以外のプラットフォームでは、手順が異なる場合があります。サンプル アプリケーションで使用されているサンプル コードは、プラットフォームによって内容が異なります。
  1. simpapp 用にディレクトリを作成し、そのディレクトリに移動 (cd) します。
  2. mkdir simpdir
    cd simpdir
    注意 : この作業は省略せずに行ってください。この作業を行うと、最初からあった simpapp のファイルと、手順に従って作成したファイルを確認できるようになります。csh を使用せずに、標準シェル (/bin/sh) または Korn シェルを使用してください。
  3. 環境変数を設定し、エクスポートします。
  4. 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 : コンフィグレーション ファイルの編集とロード」を参照してください。

  5. simpapp ファイルをコピーします。
  6. cp $TUXDIR/samples/atmi/simpapp/* .
    注意 : 一部のファイルは、後で編集して実行可能ファイルを作成します。そのため、ソフトウェアに同梱のオリジナルのファイルではなく、そのコピーを使用することをお勧めします。
  7. ファイルを一覧表示します。
  8.   $ 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 ファイルには、ほかのファイルの説明が記述されています。

    次は、アプリケーションの核となる 3 つのファイルです。

    • simpcl.c - クライアント プログラムのソース コード
    • simpserv.c - サーバ プログラムのソース コード
    • ubbsimple - このアプリケーション用のテキスト形式のコンフィグレーション ファイル

関連項目

 


ステップ 2 : クライアント プログラムの検証およびコンパイル

クライアント プログラムの検証

ATMI クライアント プログラムのソース コードの内容を確認します。

    $ more simpcl.c

以下に出力結果を示します。

コード リスト 2-1 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 }

表 2-1 simpcl.c ソース コードでの重要なコード行
行数
ファイル/関数
目的
     
2
atmi.h
Oracle Tuxedo の ATMI 関数を使用する場合に、常に必要となるヘッダ ファイル。
28
tpinit()
クライアント プログラムがアプリケーションに参加する際に使用される ATMI 関数。
33
tpalloc()
型付きバッファの割り当てに使用される ATMI 関数です。STRING は、Oracle Tuxedo の 5 つの基本的なバッファ型のひとつです。NULL は、サブタイプの引数がないことを示します。最後の引数 sendlen + 1 は、バッファの長さを指定します。文字列の終わりを示す NULL 文字用に 1 が加えられています。
38
tpalloc()
応答メッセージにほかのバッファを割り当てます。
45
tpcall()
最初の引数に指定された TOUPPER サービスにメッセージ バッファを送信します。また、応答バッファのアドレスも指定します。tpcall() はメッセージが返されるまで待機します。
35, 41, 52, 60
tpterm()
アプリケーションを終了するための ATMI 関数。tpterm() は、エラー条件の発生により終了する (36、42、53 行目) 前に、アプリケーションを終了する場合に使用します。tpterm() への最終呼び出し (60 行目) は、メッセージが出力された後に行われます。
40, 50, 51, 58, 59
tpfree()
バッファの割り当てを解放します。tpfree() は、tpalloc() とは反対の処理を行います。
55
printf()
プログラムの正常終了を示します。サーバから返されたメッセージを出力します。

クライアント プログラムのコンパイル

  1. buildclient を実行して、クライアント プログラムをコンパイルします。
  2.     buildclient -o simpcl -f simpcl.c

    simpcl は出力ファイル、simpcl.c は入力ソース ファイルです。

  3. 結果を確認します。
  4. $ 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

    simpcl という実行可能モジュールが作成されました。simpcl ファイルのサイズは一定ではありません。

関連項目

 


ステップ 3 : サーバの検証およびコンパイル

サーバ プログラムの検証

ATMI サーバ プログラムのソース コードの内容を確認します。

$ more simpserv.c
コード リスト 2-2 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)

12 tpsvrinit(int argc, char *argv[])
13 #else
14 tpsvrinit(argc, argv)
15 int argc;
16 char **argv;
17 #endif
18 {
19 /* argc と argv が使用されないと、コンパイラによる警告メッセージが出力されます。
20 */
21 argc = argc;
22 argv = argv;
23 /* userlog は TUXEDO 中央メッセージ ログに書き込みます。 */
24 userlog("Welcome to the simple server");
25 return(0);
26 }
27 /* この関数は、クライアントから要求された実際のサービスを実行します。
引数には、データ バッファへのポインタ、データ バッファの長さなどを含む構造体を
指定します。
30 */
31 #ifdef __cplusplus
32 extern "C"
33 #endif
34 void
35 #if defined(__STDC__) || defined(__cplusplus)
36 TOUPPER(TPSVCINFO *rqst)
37 #else
38 TOUPPER(rqst)
39 TPSVCINFO *rqst;
40 #endif
41 {
42 int i;
43
44 for(i = 0; i < rqst->len-1; i++)
45 rqst->data[i] = toupper(rqst->data[i]);
46 /* 転送されたバッファを要求の発信元に返します。*/
47 tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
48 }

表 2-2 simpserv.c ソース コードでの重要なコード行
行数
ファイル/関数
目的
ファイル全体
 
Oracle Tuxedo のサーバには、main() 関数が含まれていません。main() 関数は、サーバのビルド時に Oracle Tuxedo システムによって提供されます。
12
tpsvrinit()
このサブルーチンは、サーバの初期化時 (サーバがサービス要求を処理する前) に呼び出されます。Oracle Tuxedo システムで提供されるデフォルトのサブルーチンでは、サーバが起動したことを示すメッセージが USERLOG に書き込まれます。userlog(3c) は、Oracle Tuxedo システムで使用されるログで、アプリケーションでも使用できます。
38
TOUPPER()
サービス (simpserv で唯一実行されるサービス) の宣言です。このサービスに必要な唯一の引数は、TPSVCINFO 構造体へのポインタです。この構造体には、大文字に変換する文字列データが格納されます。
45
for loop
TOUPPER を繰り返し呼び出して、入力を大文字に変換します。
49
tpreturn()
TPSUCCESS フラグに設定された値と、変換された文字列をクライアントに返します。

サーバ プログラムのコンパイル

  1. buildserver を実行して、ATMI サーバ プログラムをコンパイルします。
  2.     buildserver -o simpserv -f simpserv.c -s TOUPPER

    simpserv は作成される実行ファイル、simpserv.c は入力ソース ファイルです。-s TOUPPER オプションは、サーバの起動時に宣言されるサービスを指定します。

  3. 結果を確認します。
  4. $ 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 という実行可能モジュールが作成されました。

関連項目

 


ステップ 4 : コンフィグレーション ファイルの編集とロード

コンフィグレーション ファイルの編集

  1. テキスト エディタで、simpapp のコンフィグレーション ファイル ubbsimple の内容を確認します。
  2. コード リスト 2-3 simpapp コンフィグレーション ファイル
    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
  3. 山かっこで囲まれた各文字列 <string> を適切な値に置き換えます。

コンフィグレーション ファイルのロード

  1. tmloadcf を実行して、コンフィグレーション ファイルをロードします。
  2. $ tmloadcf ubbsimple
    TUXCONFIG ファイルを初期化しますか: /usr/me/simpdir/tuxconfig [y, q] ? y
    $
  3. 結果を確認します。
  4. $ 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 システムで制御される新しいファイルです。

関連項目

 


ステップ 5 : アプリケーションの起動

  1. tmboot を実行して、アプリケーションを起動します。
  2. $ 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 サーバです。

関連項目

 


ステップ 6 : ランタイム アプリケーションの実行

simpapp を実行するには、クライアントから要求を送信します。

$ simpcl “hello, world”
Returned string is: HELLO, WORLD

関連項目

 


ステップ 7 : ランタイム アプリケーションのモニタ

システム管理者は tmadmin コマンド インタプリタを使用して、アプリケーションを調べ、動的に変更を加えることができます。tmadmin を実行するには、TUXCONFIG 環境変数を設定する必要があります。

tmadmin を使用すると、50 個以上のコマンドを解釈したり実行することができます。完全なリストについては、「tmadmin(1)」を参照してください。この例では、2 つの tmadmin コマンドを使用します。

  1. 次のコマンドを入力します。
  2. $ tmadmin

    次が出力されます。

    tmadmin - Copyright (c) 1999 BEA Systems, Inc. All rights reserved.
    >
注意 : 大なり記号 (>) は、tmadmin のプロンプトです。
  1. printserver(psr) コマンドを入力して、サーバに関する情報を出力します。
  2. > psr
    a.out 名 キュー名 グループ名 ID 要求終了 ロード終了 現サービス
    ---------- ---------- -------- -- ------ --------- ---------------
    BBL 531993 simple 0 0 0 ( IDLE )
    simpserv 00001.00001 GROUP1 1 0 0 ( IDLE )
    >
  3. printservice(psc) コマンドを入力して、サービスに関する情報を出力します。
  4. > psc
    サービス名 ルーチン名 a.out 名 グループ名 ID マシン 終了数 状態
    ------------ ------------ ---------- -------- -- ------- ------ ------
    TOUPPER TOUPPER simpserv GROUP1 1 simple - AVAIL
    >

関連項目

 


ステップ 8 : アプリケーションの停止

  1. tmshutdown を実行して、アプリケーションを停止します。
  2. $ tmshutdown
    すべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスをシャットダウンさせますか?(y/n): y
    /usr/me/simpdir/tuxconfig のすべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスをシャットダウンします。
    アプリケーションのサーバ・プロセスをシャットダウンします。
    サーバ ID = 1 グループ ID = GROUP1 マシン = simple:    シャットダウンしました。
    管理プロセスをシャットダウンします。
    サーバ Id = 0 グループ Id = simple マシン = simple:  シャットダウンしました。
    2 個のプロセスが終了しました。
    $
  3. ULOG の内容を確認します。
  4. $ 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: システムを終了します。

関連項目


  ページの先頭       前  次