第二章
一個簡單的Tuxedo應用程序simpapp
本章介紹了BEA Tuxedo的一個簡單例子,用C語言編寫的simpapp,它包含了一個客戶程序和一個伺服器,伺服器只執行一個服務:從客戶程序接收小寫字母,將其轉換成大寫後,返回給客戶程序。在使用這個例子之前,需要在系統中安裝C語言編譯器。
準備simpapp的文件和資源
在準備simpapp例子之前,系統中必須安裝了BEA Tuxedo軟體,而且要設置$TUXDIR環境變數,NT平台下為%TUXDIR%,並把%TUXDIR%\bin加到PATH中,最後還要確保你的工作目錄要有寫許可權。完成這些工作後,請按如下步驟來準備simpapp程序:
⑴. 複製simpapp所需要的所有文件,它們位於$TUXDIR/samples/atmi/simpapp目錄下;
⑵. 檢查並編譯客戶程序;
⑶. 檢查並編譯服務程序;
⑷. 編輯並載入配置文件;
⑸. 啟動應用程序;
⑹. 執行運行時應用程序;
⑺. 監視運行時應用程序;
⑻. 關閉應用程序。
完成這個例子後,你應該理解客戶程序和伺服器所執行的任務,根據你的環境編寫一個配置文件,通過tmadmin檢查應用程序的活動。同時,你應該理解BEA Tuxedo應用程序的基本組成部分:客戶程序、伺服器程序、配置文件,通過BEA Tuxedo系統的哪些命令來管理你的應用程序。
1.複製simpapp例子的相關文件
⑴. 創建目錄:
mkdir simpdir
cd simpdir
⑵. 設置並導出環境變數
TUXDIR=BEA Tuxedo系統的根目錄,如UNIX系統下可以設置為:
TUXDIR=”/usr/tuxedo”,NT系統下可以設置為:
TUXDIR=”G:\Program Files\BEA System\Tuxedo”
TUXCONFIG=當前工作目錄加上/tuxconfig,如UNIX系統下可以設置為:
TUXCONFIG=”/usr/me/simpdir/tuxconfig”,NT系統下可以設置為:
TUXCONFIG=”G:\simpdir\tuxconfig”
PATH=$PATH:$TUXDIR/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
export TUXDIR TUXCONFIG PATH LD_LIBRARY_PATH
TUXDIR和PATH用於訪問BEA Tuxedo系統的文件和執行命令,在Sun Solaris系統中,必須把/usr/5bin放在PATH中的第一個,在RS6000中的AIX上,將LD_LIBRARY_PATH替換成LIBPATH,在HP9000中的HP-UX上,將LD_LIBRARY_PATH替換為SHLIB_PATH。
設置TUXCONFIG的目的是用於載入配置文件。
⑶. 複製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
文件說明:
simpcl.c客戶程序的源代碼
simpserv.c服務程序的源代碼
ubbsimple應用程序配置文件的純文本形式
2.檢查並編譯客戶程序
⑴. 檢查客戶程序
$more simpcl.c
#include <stdio.h>
#include “atmi.h” /* TUXEDO的頭文件 */
#if defined(__STDC__) || defined(__cplusplus)
main(int argc, char *argv[])
#else
main(argc, argv)
int argc;
char *argv[];
#endif
{
char *sendbuf, *rcvbuf;
long sendlen, rcvlen;
int ret;
if(argc != 2) {
(void) fprintf(stderr, “Usage: simpcl string\n”);
exit(1);
}
/* 作為一個客戶過程連接到System/T */
if (tpinit((TPINIT *) NULL) == -1) {
(void) fprintf(stderr, “Tpinit failed\n”);
exit(1);
}
sendlen = strlen(argv[1]);
/* 分配一個供請求響應使用的STRING 緩衝區 */
if((sendbuf = (char *) tpalloc(“STRING”, NULL, sendlen+1)) == NULL) {
(void) fprintf(stderr,”Error allocating send buffer\n”);
tpterm();
exit(1);
}
if((rcvbuf = (char *) tpalloc(“STRING”, NULL, sendlen+1)) == NULL) {
(void) fprintf(stderr,”Error allocating receive buffer\n”);
tpfree(sendbuf);
tpterm();
exit(1);
}
(void) strcpy(sendbuf, argv[1]);
/* Request the service TOUPPER, waiting for a reply */
ret = tpcall(“TOUPPER”, (char *)sendbuf, 0,
(char **)&rcvbuf, &rcvlen, (long)0);
if(ret == -1) {
(void) fprintf(stderr, “Can’t send request to service TOUPPER\n”);
(void) fprintf(stderr, “Tperrno = %d\n”, tperrno);
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
exit(1);
}
(void) fprintf(stdout, “Returned string is: %s\n”, rcvbuf);
/* Free Buffers & Detach from System/T */
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
return(0);
}
說明:
|
語句 |
說明 |
|
atmi.h |
調用ATMI函數必須的頭文件 |
|
tpinit() |
客戶程序調用它來加入應用程序 |
|
tpalloc() |
用於分配類型緩衝區的ATMI函數,STRING是五種BEA Tuxedo緩衝區數據類型之一,sendlen+1表示緩衝區類型,因為以空字元結尾,所以長度加1 |
|
tpcall() |
把消息緩衝區送到TOUPPER服務,它提供了響應緩衝區的地址,它一直等待著返回消息 |
|
tpterm() |
用於退出應用程序的ATMI函數, |
|
tpfree() |
釋放分配的緩衝區,是和tpalloc()相對應的函數 |
⑵. 編譯客戶程序
$buildclient -o simpcl -f simpcl.c
-o指明輸出目標文件名,-f指出源文件名
3.檢查並編譯服務程序
⑴. 檢查服務程序
$more simpserv.c
#include <stdio.h>
#include <ctype.h>
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
/* 當伺服器啟動時,在處理請求之前,tpsvrinit被執行,這個不是必須的,對應的函數是shutdown*/
#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
{
/* 當argc, argv沒有被使用時,一些系統會發了警告 */
argc = argc;
argv = argv;
/* userlog用於將TUXEDO消息寫到日誌文件中 */
userlog(“Welcome to the simple server”);
return(0);
}
/* TOUPPER真正處理客戶請求,它接收的參數是一個緩衝區指針 */
#ifdef __cplusplus
extern “C”
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOUPPER(TPSVCINFO *rqst)
#else
TOUPPER(rqst)
TPSVCINFO *rqst;
#endif
{
int i;
for(i = 0; i < rqst->len-1; i++)
rqst->data[i] = toupper(rqst->data[i]);
/* 返迴轉換後的類型緩衝區 */
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}
說明:
|
語句 |
說明 |
|
whole file |
整個服務程序不提供main函數,在build時,由BEA Tuxedo系統提供。 |
|
tpsvrinit() |
在伺服器初始化即處理請求之前被調用。若沒有提供該函數,BEA Tuxedo系統會提供一個預設的,它向USERLOG中寫一條消息,說明伺服器已經被啟動。userlog(3c)是系統提供的一個寫日誌的方法。 |
|
TOUPPER() |
simpserv提供的唯一一個服務,它接收一個TPSVCINFO結構,它包含了要被轉換成大寫的字元串。 |
|
for loop |
BEA Tuxedo系統的循環,用於逐一轉換。 |
|
tpreturn() |
⑵. 編譯伺服器
$buildserver –o simpserv –f simpserv.c –s TOUPPER
–s TOUPPER指明了在伺服器啟動時需要提供的服務
4.編輯並加配置文件
⑴. 怎樣編輯配置文件
#ident “@(#) apps/simpapp/ubbsimple $Revision: 1.1.10.1 $”
#Skeleton UBBCONFIG file for the TUXEDO Simple Application.
# 將<>里而的內容替換成實際值.
*RESOURCES
IPCKEY <Replace with a valid IPC Key>
#Example:
#IPCKEY 123456
DOMAINID simpapp
MASTER simple
MAXACCESSERS 10
MAXSERVERS 5
MAXSERVICES 10
MODEL SHM
*MACHINES
DEFAULT:
APPDIR=”<Replace with the current directory pathname>”
TUXCONFIG=”<Replace with your TUXCONFIG Pathname>”
TUXDIR=”<Directory where TUXEDO is installed>”
#Example:
# APPDIR=”/home/me/simpapp”
# TUXCONFIG=”/home/me/simpapp/tuxconfig”
# TUXDIR=”/usr/tuxedo”
# 對於NT平台,可以替換成如下值
# APPDIR=”G:\JQEJB\simpapp”
# TUXCONFIG=”G:\JQEJB\simpapp\tuxconfig”
# TUXDIR=”G:\Program Files\BEA System\Tuxedo”
<Machine-name> LMID=simple
以下文章點擊率最高
Loading…