tuxedo應用程序開發指南2

第二章
一個簡單的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

TUXDIRPATH用於訪問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…

     

如果這文章對你有幫助,請掃左上角微信支付-支付寶,給於打賞,以助博客運營