|
函數名 |
輸入FML字段 |
輸出 FML字段 |
服務名稱 |
|
BALANCE() |
ACCOUNT_ID |
SBALANCE |
INQUIRY |
|
WITHDRAWAL() |
ACCOUNT_ID SAMOUNT |
SBALANCE |
WITHDRAWAL |
|
DEPOSIT() |
ACCOUNT_ID SAMOUNT |
SBALANCE |
DEPOSIT |
|
TRANSFER() |
ACCOUNT_ID (0) ACCOUNT_ID (1) SAMOUNT |
SBALANCE (0) SBALANCE (1) |
TRANSFER |
|
OPEN_ACCT() |
LAST_NAME FIRST_NAME MID_INIT SSN ADDRESS PHONE ACCT_TYPE BRANCH_ID SAMOUNT |
ACCOUNT_ID SBALANCE |
OPEN_ACCT |
|
CLOSE_ACCT() |
ACCOUNT_ID |
SBALANCE |
CLOSE_ACCT |
⑷. 調用成功完成後,每個函數可以從返回的FML緩衝區中取得需要的數據
do_tpcall()函數的代碼如下:
static int do_tpcall(char *service){
long len;
char *server_status;
/* 開始一個全局事務 */
if (tpbegin(30, 0) == -1) {
(void)fprintf(stderr, “ERROR: tpbegin failed (%s)\n”,tpstrerror(tperrno));
return(-1);
}
/* 使用用戶數據請求服務 */
if (tpcall(service, (char *)fbfr, 0, (char **)&fbfr, &len,0) == -1) {
if(tperrno== TPESVCFAIL && fbfr != NULL &&
(server_status=Ffind(fbfr,STATLIN,0,0)) != 0) {
(void)fprintf(stderr, “%s returns failure (%s)\n”, service,server_status);
}else {
(void)fprintf(stderr,”ERROR: %s failed (%s)\n”, service,
tpstrerror(tperrno));
}
/* 終止事務*/
(void) tpabort(0);
return(-1);
}
/* 提交事務 */
if(tpcommit(0) < 0) {
(void)fprintf(stderr, “ERROR: tpcommit failed (%s)\n”,tpstrerror(tperrno));
return(-1);
}
return(0);
}
2.bankapp中怎樣使用ud(1)
bankapp使用到了Tuxedo系統的ud(1)程序,它允許數據從標準輸入讀取,並送到服務。populate和driver例程都用到了ud。
在populate中,一個叫gendata的程序把服務請求以及要輸入數據庫的客戶帳號信息一起傳給了ud。
在driver中也存在類似的數據流,但程序是gentran,它的作用是把事務傳遞給應用程序以模擬一個活動系統。
3.一個請求/響應客戶:audio.c
audit中一個請求/響應客戶程序,用於支行或全行範圍內的餘額查詢,它用到ABAL、TBAL、ABAL_BID、TBAL_BID服務,你可以通過如下兩種方法來激活它:
audit [-a|-t],-a打印全行所有賬號總額,[-t]打印全行範圍內所有出納員的現金供應。
audit [-a|-t] branch_ID,打印某支行Branch_ID的上述信息。
audit源代碼包括兩個主要部分:main()和sum_bal()子程序。兩部分都用到了ATMI函數,它用到了一個在aud.h頭文件中定義的VIEW類型的緩衝區,如下它的偽碼:
main(){
Parse command-line options with getopt();
Join application with tpinit();
Begin global transaction with tpbegin();
If (branch_ID specified) {
Allocate buffer for service requests with tpalloc();
Place branch_ID into the aud structure;
Do tpcall() to “ABAL_BID” or “TBAL_BID”;
Print balance for branch_ID;
Free buffer with tpfree();
}else
call subroutine sum_bal();
Commit global transaction with tpcommit();
Leave application with tpterm();
}
sum_bal(){
Allocate buffer for service requests with tpalloc();
For (each of several representative branch_ID’s,one for each site)
Do tpacall() to “ABAL” or “TBAL”;
For (each representative branch_ID) {
Do tpgetrply() wtith TPGETANY flag set
to retrieve replies;
Add balance to total;
Print total balance;
}
Free buffer with tpfree();
}
audit.c首先檢查命令行參數,看是否指定的支行代號。若指定,則將它放入aud結構,並調用ABAL_BID或TBAL_BID服務來處理請求;否則就調用sum_bal()子過程來處理。它們的程序流程圖如下:


4.一個會話客戶:auditcon.c
auditcon是audit的會話版,它使用了ATMI與會話相關的函數,如使用tpconnect()建立服務與客戶之間的連接,用tpsend()發送一條消息,用tprecv()接收消息。如下是它的偽碼:
main(){
Join the application
Begin a transaction
Open a connection to conversational service AUDITC
Do until (user says to quit) {
Query user for input
Send service request
Receive response
Print response on user’s terminal
Prompt for further input
}
Commit transaction
Leave the application
}
5.一個監視事件的客戶bankmgr.c
bankmgr是一個始終運行的應用程序,它訂閱應用程序定義的事件,如一次存取超過10000美元的事件。
§3.3 檢查bankapp的服務器和服務
服務器是一些可執行的進程,它們提供一個或多個服務。在Tuxedo系統中,服務器始終接受來自客戶端的服務請求,並將它們分配給某些服務,讓它們來處理請求。所有bankapp的服務都是用C語言寫的,包含有嵌入式SQL語句的C程序擴展名不是C而是EC。TRANSFER由XFER服務器來提供,它是唯一一個不包含嵌入式SQL的服務。所有bankapp服務使用ATMI的函數來管理類型緩衝區、和其它服務進行同步或異不通信、定義全局事務、一般地訪問資源服務器、把響應發送回客戶端。
1.bankapp的請求/響應服務器
bankapp的5個服務器中,有4個用到了嵌入式SQL訪問資源管理器,這些服務器的擴展名為EC。XFER是一個轉賬的服務器,本身不調用資源管理器,而調用了其它服務器中的WITHDRAWAL和DEPOSIT兩個服務。5個服務器的描述如下:
|
服務器 |
提供的功能 |
|
BTADD.EC |
允許任何一個站的支行和出納員的記錄添加到數據庫中 |
|
ACCT.EC |
提供一些賬號相關的有代表性的服務,如OPEN_ACCT, CLOSE_ACCT |
|
TLR.EC |
為出納員提供服務,如WITHDRAWAL, DEPOSIT, INQUIRY,每一個TLR進程標識着它本身是TELLER文件中的一個真實的出納員 |
|
XFER.C |
在賬號之間進行轉賬業務 |
|
BAL.EC |
計算所有支行或某個支行的餘額 |
2.bankapp的會話服務器
AUDITC是一個會話服務器的例子,它提供了一個服務,名字也叫AUDITC。客戶機auditcon建立一個與服務AUDITC的會話連接,然後發出請求。AUDITC分析請求,並調用適當的服務(ABAL,TBAL,ABAL_BID,TBAL_BID),當AUDITC從這些服務獲得響應後,再將它們送回auditcon。會話服務器可以以客戶機的身份請求其它服務,也可以連接到其它會話服務器。
3.bankapp的服務
bankapp提供了12個請求/響應服務。服務名和C語言函數名相同:
|
服務名 |
提供服務器 |
輸入 |
執行功能 |
|
BR_ADD |
BTADD |
FML緩衝區 |
添加一個新支行記錄 |
|
TLR_ADD |
BTADD |
FML緩衝區 |
添加一條新出納員記錄 |
|
OPEN_ACCT |
ACCT |
FML緩衝區 |
向ACCOUNT文件中插入一條記錄並調用DEPOSIT存入開戶金額;在支行代號BRANCH_ID的基礎上選擇一個ACCOUNT_ID |
|
CLOSE_ACCT |
ACCT |
FML緩衝區 |
刪除一個ACCOUNT記錄;驗證ACCOUNT_ID; 調用WITHDRAWAL取走所有餘額 |
|
WITHDRAWAL |
TLR |
FML緩衝區 |
從一個指定的支行、出納員、賬號取款; 驗證ACCOUNT_ID和SAMOUNT字段 |
|
DEPOSIT |
TLR |
FML緩衝區 |
向某個支行、出納員、賬號存款; 驗證ACCOUNT_ID和SAMOUNT字段 |
|
INQUIRY |
TLR |
FML緩衝區 |
查詢賬號餘額;驗證ACCOUNT_ID |
|
TRANSFER |
XFER |
FML緩衝區 |
執行一個tpcall()調用,先後請求WITHDRAWAL和DEPOSIT服務 |
|
ABAL |
BAL |
aud.v的VIEW緩衝區 |
計算某一個站點所有賬號的餘額 |
|
TBAL |
BAL |
aud.v的VIEW緩衝區 |
計算某個站點所有支行出納員的餘額 |
|
ABAL_BID |
BAL |
aud.v的VIEW緩衝區 |
計算BRANCH_ID的賬號餘額 |
以下文章點擊率最高
Loading…