Oracle Tuxedo ATMIアプリケーション開発のためのチュートリアル

     前  次    新規ウィンドウで目次を開く    PDFとして表示 - 新規ウィンドウ  Adobe Readerを入手 - 新規ウィンドウ
コンテンツはここから始まります

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

このトピックには次の項が含まれます:

 


simpappとは

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

 


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

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

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

simpappの開発プロセス

始める前に

このチュートリアルを実行するには、Oracle Tuxedo ATMIクライアント/サーバー・ソフトウェアがインストールされ、ここで説明するファイルやコマンドを使用できることが必要です。すでにインストールされている場合は、ソフトウェアのインストール先のディレクトリのパス名(TUXDIR)を確認する必要があります。また、simpappのファイルをコピーしたり、Oracle Tuxedoの各コマンドを実行したりするために、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=pathname of the Oracle Tuxedo system root directory
    TUXCONFIG=pathname of your present working directory/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に出力結果を示します。

リスト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             /* Attach to BEA TUXEDO as a Client Process */
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, tpstrerror(tperrno));
49                      tpfree(sendbuf);
50                      tpfree(rcvbuf);
51                      tpterm();
52                      exit(1);
53             }
54             printf("Returned string is: %s\n", rcvbuf);
55
56             /* Free Buffers & Detach from Oracle TUXEDO */
57             tpfree(sendbuf);
58             tpfree(rcvbuf);
59             tpterm();
60    }

表2-1 simpcl.cソース・コードでの重要なコード行
行数
ファイル/関数
目的
     
2
atmi.h
Oracle Tuxedo ATMI関数を使用する場合に、常に必要となるヘッダー・ファイル。
28
tpinit()
クライアント・プログラムがアプリケーションに参加する際に使用されるATMI関数。
33
tpalloc()
型付きバッファの割当てに使用されるATMI関数です。STRINGは、Oracle Tuxedoの5つの基本的なバッファ型の1つです。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を実行して、ATMIクライアント・プログラムをコンパイルします。
  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 Header File */
4 #include <userlog.h> /* TUXEDO Header File */
5 /* tpsvrinit is executed when a server is booted, before it begins
   processing requests. It is not necessary to have this function.
   Also available is tpsvrdone (not used in this example), which is
   called at server shutdown time.
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         /* Some compilers warn if argc and argv aren't used.
20          */
21        argc = argc;
22        argv = argv;
23        /* userlog writes to the central TUXEDO message log */
24         userlog("Welcome to the simple server");
25         return(0);
26 }
27 /* This function performs the actual service requested by the client.
      Its argument is a structure containing, among other things, a pointer
      to the data buffer, and the length of the data buffer.
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       /* Return the transformed buffer to the requestor. */
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 #Skeleton UBBCONFIG file for the BEA Tuxedo Simple Application.
    4 #Replace the <bracketed> items with the appropriate values.
    5 RESOURCES
    6 IPCKEY            <Replace with valid IPC Key greater than 32,768>
    7
    8 #Example:
    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="<Replace with the current pathname>"
    24             TUXCONFIG="<Replace with TUXCONFIG Pathname>"
    25         UXDIR="<Root directory of Tuxedo (not /)>"
    26 #Example:
    27 #       APPDIR="/usr/me/simpdir"
    28 #       TUXCONFIG="/usr/me/simpdir/tuxconfig"
    29 #       TUXDIR="/usr/tuxedo"
    30
    31 <Machine-name> LMID=simple
    32 #Example:
    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
    Initialize TUXCONFIG file: /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
    Boot all admin and server processes? (y/n): y
    Booting all admin and server processes in /usr/me/simpdir/tuxconfig
    Booting all admin processes ...
    exec BBL -A:
    process id=24223 ... Started.
    Booting server processes ...
       exec simpserv -A :
    process id=24257 ... Started.
    2 processes started.
    $

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 Name Queue Name Grp Name ID RqDone Load Done Current Service
    ---------- ---------- -------- -- ------ --------- ---------------
    BBL 531993 simple 0 0 0 ( IDLE )
    simpserv 00001.00001 GROUP1 1 0 0 ( IDLE )
    >
  3. printservice(psc)コマンドを入力して、サービスに関する情報を出力します。
  4. > psc
    Service Name Routine Name a.out Name Grp Name ID Machine # Done Status
    ------------ ------------ ---------- -------- -- ------- ------ ------
    TOUPPER TOUPPER simpserv GROUP1 1 simple - AVAIL
    >

関連項目

 


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

  1. tmshutdownを実行して、アプリケーションを停止します。
  2. $ tmshutdown
    Shutdown all admin and server processes? (y/n): y
    Shutting down all admin and server processes in /usr/me/simpdir/tuxconfig
    Shutting down server processes ...
    Server Id = 1 Group Id = GROUP1 Machine = simple:    shutdown succeeded.
    Shutting down admin processes ...
    Server Id = 0 Group Id = simple Machine = simple:    shutdown succeeded.
    2 processes stopped.
    $
  3. ULOGの内容を確認します。
  4. $ cat ULOG*
    $
    113837.tuxmach!tmloadcf.10261: CMDTUX_CAT:879: A new file system has been created. (size = 32 4096-byte blocks)
    113842.tuxmach!tmloadcf.10261: CMDTUX_CAT:871: TUXCONFIG file /usr/me/simpdir/tuxconfig has been created
    113908.tuxmach!BBL.10768: LIBTUX_CAT:262: std main starting
    113913.tuxmach!simpserv.10925: LIBTUX_CAT:262: std main starting
    113913.tuxmach!simpserv.10925: Welcome to the simple server
    114009.tuxmach!simpserv.10925: LIBTUX_CAT:522: Default tpsvrdone() function used.
    114012.tuxmach!BBL.10768: CMDTUX_CAT:26: Exiting system

関連項目


  先頭に戻る       前  次