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

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

 Previous Next Contents View as PDF  

アプリケーション例

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

 


この付録の内容

この付録では、TxRPC を使用した rcpsimp と呼ばれる単一クライアント、単一サーバで構成するアプリケーションについて解説します。この対話型アプリケーションのソース・ファイルは、BEA Tuxedo ソフトウェアと共に配布されていますが、RTK 製品には含まれません。

 


前提条件

このアプリケーション例を実行する前に、BEA Tuxedo ソフトウェアをインストールし、この付録で参照するファイルやコマンドが使用できるようにしておきます。

 


rpcsimp アプリケーションの構築

rpcsimp は、TxRPC を利用した非常に基本的な BEA Tuxedo アプリケーションです。このアプリケーションは、1 つのクライアントと 1 つのサーバで構成します。クライアントはリモート・プロシージャ・コール (オペレーション) to_upper()to_lower() を呼び出します。これらのプロシージャ・コールは、いずれもサーバ内に実装されるものです。オペレーション to_upper() は、文字列を小文字から大文字へ変換してクライアントに返します。一方 to_lower() は、文字列を大文字から小文字へ変換してクライアントに返します。各プロシージャ・コールが復帰すると、クライアントは文字列出力をユーザの画面に表示します。

以下に本プログラム例を構成、実行する手順を解説します。

ステップ 1:アプリケーション・ディレクトリの作成

rpcsimp 用のディレクトリを作成し、そのディレクトリに移動します。

mkdir rpcsimpdir
cd rpcsimpdir

注記 この様にしておくと、作業開始時にあった rpcsimp 関連のファイルと、作業中に作成した新たなファイルを容易に把握できます。標準シェル (/bin/sh) または Korn シェルを使用してください。C シェル (csh) は使わないでください。

ステップ 2:環境変数の設定

必要な環境変数を設定し、エクスポートします。

TUXDIR=<BEA Tuxedo システム・ルート・ディレクトリのパス名>
TUXCONFIG=<現在の作業ディレクトリのパス名>/TUXCONFIG
PATH=$PATH:$TUXDIR/bin
# SVR4, Unixware
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
# HPUX
SHLIB_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
# RS6000
LIBPATH=$LD_LIBRARY_PATH:$TUXDIR/lib
export TUXDIR TUXCONFIG PATH LD_LIBRARY_PATH SHLIB_PATH LIBPATH

注記 TUXDIRPATH は、BEA Tuxedo のディレクトリ構造内のファイルにアクセスし、BEA Tuxedo コマンドを実行するのに必要です。コンフィギュレーション・ファイルがロードできるようにするには、TUXCONFIG を設定する必要があります。共有オブジェクトを使用する場合、LD_LIBRARY_PATH 環境変数も設定します。

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

rpcsimp 用のファイルをアプリケーション・ディレクトリにコピーします。

cp $TUXDIR/apps/rpcsimp/* .

一部のファイルを編集してから、実行形式ファイルを作成することがあるので、本ソフトウェアで提供されたオリジナルのファイルではなく、コピーしたファイルを用いて作業することをお勧めします。

ステップ 4:ファイルの一覧表示

ファイルを一覧表示します。

$ ls
client.c
rpcsimp.mk
server.c
simp.idl
ubbconfig
wclient.def
wsimpdll.def
$

注記 この一覧には、DCE ゲートウェイ・アプリケーションで説明する DCE ゲートウェイ例で使用するファイルは含まれていません。

アプリケーションを構成するファイルは次のセクションで説明します。

IDL 入力ファイル−simp.idl

コード リスト E-1 simp.idl

[uuid(C996A680-9FC2-110F-9AEF-930269370000), version(1.0) ]
interface changecase
{
/* 文字列を大文字に変換 */
void to_upper([in, out, string] char *str);
/* 文字列を小文字に変換 */
void to_lower([in, out, string] char *str);
}

このファイルは 2 つのオペレーション (to_upperto_lower) を持った単一インターフェイス (changecase version1.0) を定義します。各オペレーションは、NULL (文字)で終わる文字列を入出力パラメータとして使用します。ACF フィルは提供されないので、状態変数は使用されず、クライアント・プログラムは例外処理を行う必要があります。各オペレーションには戻り値が生成されないことを示すために void で宣言します。simp.idl はスタブ関数の生成に使用されます (以下を参照)。

クライアント・ソース・コード−client.c

コード リスト E-2 client.c

#include <stdio.h>
#include "simp.h"
#include "atmi.h"
main(argc, argv)
int argc;
char **argv;
{
idl_char str[100];
unsigned char error_text[100];
int status;
  if (argc > 1) {/* コマンド行引数がある場合はそれを使用 */
(void) strncpy(str, argv[1], 100);
str[99] = '¥0';
}
else
(void) strcpy(str, "Hello, world");
  TRY
to_upper(str);
(void) fprintf(stdout, "to_upper returns:%s¥n", str);
to_lower(str);
(void) fprintf(stdout, "to_lower returns:%s¥n", str);
/* 制御の流れは ENDTRY 後に続く */
CATCH_ALL
exc_report(THIS_CATCH); /* stderr に出力 */
(void) tpterm();
exit(1);
ENDTRY
  (void) tpterm();
exit(0);
}

ヘッダ・ファイル simp.h は、simp.idl を元に IDL コンパイラによって生成され、2 つのオペレーション用の関数プロトタイプを持っています。simp.h ヘッダには、RPC ランタイム関数 (本例には示されていません) 用と例外処理用のヘッダ・ファイルも含まれます。関数 tpterm(3c) が呼び出されるので、ヘッダ・ファイル atmi.h がインクルードされます。コマンド行に引数を指定すると、その引数は大文字や小文字への変換に使用されます (デフォルトでは “hello world” になります)。例外処理はエラーの捕捉に使用されます。たとえば、サーバが利用できない、メモリを割り当てられない、通信できないなどの場合に例外が生成されます。TRY ブロックは、2 つのリモート・プロシージャをカプセル化しています。エラーが発生した場合、実行の制御は CATCH_ALL ブロックに移り、例外 (THIS_CATCH) を文字列に変換し、この文字列を exc_report を使用して標準エラー出力に表示して、終了します。アプリケーションを正しく終了するには、アプリケーションの実行が正常に行われた場合も、異常が発生した場合も共に、tidl(1) が呼び出されていることに注意してください。tpterm(3c) を呼び出さないと、ワークステーション以外のクライアントでは、userlog(3c) に警告が出力され、リソースが関連付けられたままになります。ワークステーション・クライアントでは、接続がタイムアウトするまでリソースが関連付けられたままになります。

サーバ・ソース・コード−server.c

コード リスト E-3 server.c

#include <stdio.h>
#include <ctype.h>
#include "tx.h"
#include "simp.h"
int
tpsvrinit(argc, argv)
int argc;
char **argv;
{
if (tx_open() != TX_OK) {
(void) userlog("tx_open failed");
return(-1);
}
(void) userlog("tpsvrinit() succeeds.");
return(1);
}
void
to_upper(str)
idl_char *str;
{
idl_char *p;
for (p=str; *p != '¥0'; p++)
*p = toupper((int)*p);
return;
}
void
to_lower(str)
idl_char *str;
{
idl_char *p;
for (p=str; *p != '¥0'; p++)
*p = tolower((int)*p);
return;
}

client.c の場合と同様、このファイルでも simp.h をインクルードします。

さらに、関数 tx_open(3c) を呼び出すので、このファイルは tx.h もインクルードします (リソース・マネージャにアクセスしない場合でも tx.h をインクルードします。これは X/OPEN TxRPC 仕様で定められているとおりです)。関数 tpsvrinit(3c) は、ブート時に必ず関数 tx_open() が 1 度呼び出されるようにするために用意されています。障害が起こると、-1 が返され、サーバのブートは失敗します。これは自動的に行われるので、この機能を提供する必要はありません。

これら 2 つのオペレーション関数は、アプリケーション作業、つまり今回の例では大文字や小文字への変換を行うために用意されています。

Makefile−rpcsimp.mk

コード リスト E-4 rpcsimp.mk

CC=cc
CFLAGS=
TIDL=$(TUXDIR)/bin/tidl
LIBTRPC=-ltrpc
all:client server
# Tuxedo クライアント
client: simp.h simp_cstub.o
CC=$(CC) CFLAGS=$(CFLAGS) $(TUXDIR)/bin/buildclient ¥
-oclient -fclient.c -fsimp_cstub.o -f$(LIBTRPC)
# Tuxedo サーバ
server: simp.h simp_sstub.o
CC=$(CC) CFLAGS=$(CFLAGS) $(TUXDIR)/bin/buildserver ¥
-oserver -s changecasev1_0 -fserver.c -fsimp_sstub.o ¥
-f$(LIBTRPC)
simp_cstub.o simp_sstub.o simp.h:     simp.idl
$(TIDL) -cc_cmd "$(CC) $(CFLAGS) -c" simp.idl
#
# DCE ゲートウェイの処理に関する部分は省略
#

# クリーンアップ
clean::
rm -f *.o server $(ALL2) ULOG.* TUXCONFIG
rm -f stderr stdout *stub.c *.h simpdce.idl gwinit.c
clobber:clean

makefile により、クライアントやサーバの実行プログラムが構築されます。

DCE ゲートウェイ・アプリケーションで説明する、DCE ゲートウェイの処理に関する makefile の部分はリストでは省略されています。

クライアントはヘッダ・ファイル simp.h とクライアント・スタブ・オブジェクト・ファイルに依存して構築されます。buildclient を実行すると、ソース・ファイルとして client.c を、リンクするファイルとしてクライアント・スタブ・オブジェクト・ファイルを使用し、-ltrpc RPC ランタイム・ライブラリがリンクされ、実行形式のファイルが作成、出力されます。

サーバは、ヘッダ・ファイル simp.h とサーバ・スタブ・オブジェクト・ファイルに依存して構築されます。buildserver を実行すると、ソース・ファイルとして server.c を、リンクするファイルとしてサーバ・スタブ・オブジェクトファイルを使用し、-ltrpc により、RPC ランタイム・ライブラリがリンクされ、実行形式のファイルが作成、出力されます。

クライアントやサーバのスタブ・オブジェクト・ファイルと、ヘッダ・ファイル simp.h は、いずれも IDL 入力ファイルで tidl コンパイラを実行することで作成されます。

clean ターゲットは、アプリケーションの構築中および実行中に作成されたファイルをすべて削除します。

コンフィギュレーション・ファイル−ubbconfig

ASCII コンフィギュレーション・ファイルの例を次に示します。ユーザが使用している構成に応じて、マシン名、TUXCONFIGTUXDIRAPPDIR を設定する必要があります。

コード リスト E-5 ubbconfig

*RESOURCES
IPCKEY 187345
MODEL SHM
MASTER SITE1
PERM 0660
*MACHINES
<UNAME> LMID=SITE1
TUXCONFIG="<TUXCONFIG>"
TUXDIR="<TUXDIR>"
APPDIR="<APPDIR>"
# MAXWSCLIENTS=10
*GROUPS
GROUP1 LMID=SITE1 GRPNO=1
*SERVERS
server SRVGRP=GROUP1 SRVID=1
#WSL SRVGRP=GROUP1 SRVID=2 RESTART=Y GRACE=0
# CLOPT="-A -- -n <address> -x 10 -m 1 -M 10 -d <device>"
#
# Tuxedo から DCE へのゲートウェイ
#simpgw SRVGRP=GROUP1 SRVID=2
*SERVICES
*ROUTING

MAXWSCLIENTSWSL 行は、ワークステーション構成の場合にコメントを解除します。ワークステーション・リスナ用のリテラル netaddr は、『BEA Tuxedo のファイル形式とデータ記述方法』の WSL(5) の説明に従って設定してください。

ステップ 5:構成の変更

ASCII コンフィギュレーション・ファイル ubbconfig を編集して、位置に依存した情報 (例:ユーザ独自のディレクトリ・パス名とマシン名) を指定します。置き換えるテキストは山かっこで囲みます。TUXDIRTUXCONFIGAPPDIR、および実行するマシン名は、フル・パス名に置き換えます。必要な値を以下に要約します。

TUXDIR

BEA Tuxedo ソフトウェアのルートディレクトリのフル・パス名です。上記のように設定します。

TUXCONFIG

バイナリ・コンフィギュレーション・ファイルのフル・パス名です。上記のように設定します。

APPDIR

アプリケーションを実行するディレクトリのフル・パス名です。

UNAME

アプリケーションを実行するマシンの名前です。この名前は、UNIX の uname -n コマンドが出力するものです。

ワークステーションのコンフィギュレーション・ファイルでは、MAXWSCLIENTSWSL 行のコメントを解除します。<address> は、ワークステーション・リスナに対して設定します (詳細については WSL(5) を参照)。

ステップ 6:アプリケーションの構築

次のコマンドを実行してクライアントとサーバ・プログラムを構築します。

make -f rpcsimp.mk TUXDIR=$TUXDIR

ステップ 7:コンフィギュレーション・ファイルのロード

次のコマンドを実行してバイナリの TUXCONFIG コンフィギュレーション・ファイルをロードします。

tmloadcf -y ubbconfig

ステップ 8:構成のブート

次のコマンドを実行してアプリケーションをブートします。

tmboot -y

ステップ 9:クライアントの実行

  1. 必要に応じて大文字に変換した後で小文字に変換する文字列を指定して、ネイティブ・クライアント・プログラムを実行します。
    $ client HeLlO
    to_upper returns: HELLO
    to_lower returns: hello
    $

  2. ワークステーション上で実行する場合には、環境変数 WSNADDR を WSL プログラム用に指定したアドレスと一致するように設定します。Windows クライアントは、次のコマンドで実行できます。
    >win wclient

    注記 ダイナミック・リンク・ライブラリは、別に開発されたアプリケーション (例:ビジュアル・ビルダ) で使用することもできます。

ステップ 10:RPC サーバの監視

tmadmin(1) を使うと、RPC サーバを監視できます。次の例では、psrpsc を使ってサーバ・プログラムの情報を表示します。簡潔モード (“+” で表示) では、RPC サービス名が切りつめらることに注意してください。一方、冗長モードを使えば、フル・ネームを表示できます。

コード リスト E-6 tmadmin psr および psc の出力

$ tmadmin
> psr
a.out Name Queue Name Grp Name ID RqDone Load Done Current Service
---------- ---------- -------- -- ------ --------- ---------------
BBL 587345 SITE1 0 0 0 ( IDLE )
server 00001.00001 GROUP1 1 2 100 ( IDLE )
> psc
Service Name Routine Name a.out Name Grp Name ID Machine # Done Status
------------ ------------ ---------- -------- -- ------- ------ ------
ADJUNCTBB ADJUNCTBB BBL SITE1 0 SITE1 0 AVAIL
ADJUNCTADMIN ADJUNCTADMIN BBL SITE1 0 SITE1 0 AVAIL
changecasev+ changecasev+ server GROUP1 1 SITE1 2 AVAIL
> verbose
Verbose now on.
> psc -g GROUP1
Service Name: changecasev1_0
Service Type: USER
Routine Name: changecasev1_0
a.out Name: /home/sdf/trpc/rpcsimp/server
Queue Name:00001.00001
Process ID:8602, Machine ID: SITE1
Group ID:GROUP1, Server ID:1
Current Load:50
Current Priority:50
Current Trantime:30
Requests Done:2
Current status: AVAILABLE
> quit

ステップ 11:構成のシャットダウン

次のコマンドを実行して、アプリケーションをシャットダウンします。

tmshutdown -y

ステップ 12:作成ファイルのクリーンアップ

次のコマンドを入力して、作成したファイルを削除します。

make -f rpcsimp.mk clean

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy