Tuxedo應(yīng)用指南(二)_第1頁(yè)
Tuxedo應(yīng)用指南(二)_第2頁(yè)
Tuxedo應(yīng)用指南(二)_第3頁(yè)
Tuxedo應(yīng)用指南(二)_第4頁(yè)
Tuxedo應(yīng)用指南(二)_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 ATMI及編程模型 編程涉及到的環(huán)境 類型緩沖區(qū) 編寫(xiě)客戶機(jī)程序 編寫(xiě)服務(wù)器程序 編寫(xiě)請(qǐng)求/響應(yīng)程序 編寫(xiě)會(huì)話程序 編寫(xiě)帶全局事務(wù)的服務(wù)器 使用TMIB維護(hù)和監(jiān)控系統(tǒng)ATMI(Application to Transation Monitor Interface 應(yīng)用到事務(wù)監(jiān)視器接口) 是Tuxedo為客戶實(shí)施分布式應(yīng)用提供一套C函數(shù)。ClientServer1Database1Server2Database2tpinittpcalltpbegintpcommittpreturntpforwardRMTMApplication 請(qǐng)求/響應(yīng)模型最基本的通信方式,客戶機(jī)發(fā)起請(qǐng)求,服務(wù)器進(jìn)程處理完

2、請(qǐng)求后將響應(yīng)返回客戶機(jī)。此時(shí),該交互即完成。其中異步是基本的方式: tpcall = tpacall + tpgetrplyServerClienttpcallservice_fun() tpreturnServerClienttpacall做一些事情tpgetrplyservice_fun() tpreturnServer1Clienttpcallservice_fun1() tpcall tpforward 此處代碼會(huì)執(zhí)行!service_fun2() tpreturn()Server2service_fun3() tpreturn()Server3 會(huì)話模型先建立起連接(即客戶進(jìn)程與服務(wù)

3、進(jìn)程建立起協(xié)作關(guān)系),然后在該連接上進(jìn)行多次交互。該模式是有狀態(tài)的,因?yàn)榉?wù)進(jìn)程的上下文在會(huì)話結(jié)束之前一直保持。ServertpconnectClienttpdiscontpsendtprecvtpsendtprecv上下文N次交互 消息通知前面的方式中,服務(wù)器是被動(dòng)的(處理過(guò)程需要由客戶機(jī)發(fā)起)。如果服務(wù)器要主動(dòng)給客戶發(fā)消息,就要用到消息通知。ServerClient注冊(cè)的消息處理器tpnotify/tpbroadcast 事件代理Tuxedo有一個(gè)事件代理服務(wù)器,客戶機(jī)和服務(wù)器可以通過(guò)它訂閱或發(fā)布事件。事件代理tpsubscribe事件處理器Server/ClienttppostServe

4、r/Client/Q大型應(yīng)用的一次交易處理一般會(huì)涉及與多個(gè)服務(wù)器交互(多層結(jié)構(gòu)),服務(wù)器的協(xié)作方式主要有三種: 嵌套調(diào)用在服務(wù)內(nèi)部調(diào)用另一個(gè)交易。除非必須使用,不建議采用此方式。該模式形成一個(gè)服務(wù)器調(diào)用鏈,所有鏈上的服務(wù)器在交易結(jié)束之前不能再處理其它請(qǐng)求。 轉(zhuǎn)發(fā)推送tpcall(client) tpforward(1.N) tpreturn(last) 異步推送tpacall_no_reply(client)tpacall_no_reply(1.N) endtpcallEAI適配層forward分派層forward交易處理層tpacalltpacalltpacallEND從總線取出請(qǐng)求將響應(yīng)放

5、入總線 推送是無(wú)狀態(tài)的,效率高,重入時(shí)要設(shè)法恢復(fù)它的運(yùn)行上下文。 嵌套會(huì)占用更多的進(jìn)程,并發(fā)性會(huì)降低,但調(diào)用者的上下文不會(huì)丟失。flowS1S2Local ServerRomte Serversave ctx tpacall tpcalltpacall callbackload ctxS2Storage 如果有執(zhí)行狀態(tài)返回,-1表示失敗。 查看出錯(cuò)信息在調(diào)用API時(shí)都有類似如下的出錯(cuò)檢測(cè)代碼:if (tpacall(TUX_SVC, send_buf, (long)send_len, TPNOREPLY) = -1) userlog(tpacall失敗: errno=%d, msg=%s,tp

6、errno, tpstrerror(tperrno);tpfree(text);return -1; 編程相關(guān)的UBB參數(shù) 編寫(xiě)會(huì)話服務(wù)器,要在Servers節(jié)中指示是個(gè)會(huì)話服務(wù)器(CONV=Y) 使用工作站客戶端要在Machines節(jié)中指定MAXWSCLINETS的數(shù)量 存在著大量與編程密切相關(guān)的UBB參數(shù)(參見(jiàn)用C寫(xiě)ATMI應(yīng)用第二章),系統(tǒng)配置與編程在此產(chǎn)生了較強(qiáng)的耦合。 特定用途的環(huán)境變量 使用VIEW32視圖:VIEWDIR32、VIEWFILES32 使用FML32視圖:FLDTBLDIR32、FIELDTBLS32 編譯器應(yīng)采用與操作系統(tǒng)淵源最深的編譯系統(tǒng),因?yàn)閎uildserv

7、er對(duì)編譯器是由針對(duì)性的。 AIX 使用XLC C/C+ Windows使用Visual C+ Linux使用gcc HP-UX 使用aCC/aC+ 頭文件 atmi 重要的頭文件,含ATMI接口定義,聲明公開(kāi)的函數(shù)與常量宏 fml.h/fml32.h 定義了操作FML的函數(shù)與常量 tpadmin.h 定義TMIB接口的函數(shù) userlog.h 用戶日志接口(用于生成ULOG日志文件) Tuxedo程序庫(kù)Tuxedo程序庫(kù)信息由buildserver/buildclient自動(dòng)附加到編譯命令行上,用戶一般不用關(guān)心。所有庫(kù)都在$TUXDIR/lib目錄下。 libtmib.a TMIB庫(kù),使用t

8、padmcall時(shí)要包含此庫(kù) libtux.a Tuxedo主函數(shù)庫(kù),大部分函數(shù)都在此庫(kù)中 libfml.a/libfml32.a 操作FML/FML32的函數(shù)庫(kù) lengine.a 平臺(tái)上的一些公共例程,如安全、線程管理、消息轉(zhuǎn)換等注:不知道函數(shù)在什么庫(kù)中時(shí),可用nm命令去尋找。 緩沖區(qū)的種類 分配緩沖區(qū) 釋放緩沖區(qū) 改變緩沖區(qū)的大小 數(shù)據(jù)操作(各類型緩沖區(qū)有自己的操作方法) VIEW/VIEW32 FML/FML32 XML 類型緩沖區(qū)是帶類型說(shuō)明的內(nèi)存塊,它的引入給開(kāi)發(fā)者增加一些額外的負(fù)擔(dān),但這是值得的: 類型緩沖區(qū)為異質(zhì)系統(tǒng)建立了一個(gè)中間層,當(dāng)與目標(biāo)系統(tǒng)通信時(shí),調(diào)用者與接收者只需考慮類

9、型緩沖區(qū)而不用考慮目標(biāo)主機(jī)的數(shù)據(jù)結(jié)構(gòu)(機(jī)器字節(jié)數(shù)、對(duì)齊方式、字節(jié)順序、字符編碼) 附加的好處:類型緩沖區(qū)都是動(dòng)態(tài)內(nèi)存(從堆上分配),使用類型緩沖區(qū)也便于系統(tǒng)集中管理動(dòng)態(tài)內(nèi)存(分配、釋放、優(yōu)化等),減少內(nèi)存出錯(cuò)的機(jī)率。 類型緩沖區(qū)之間的比較可以從如下幾個(gè)方面進(jìn)行: 是否是自描述的。自描述的緩沖區(qū)在tpcall、tpreturn中可不指定它的大小。 有無(wú)子類型。 是否支持DDR。根據(jù)緩沖區(qū)中的某些數(shù)據(jù)項(xiàng)的值,按指定的標(biāo)準(zhǔn)將請(qǐng)求路由到不同的服務(wù)器組上。支持DDR的緩沖區(qū)一定是帶成員的聚集,并且可以按成員名稱訪問(wèn)。 是否存在編碼、解碼。不存在時(shí),傳輸效率高,但異質(zhì)支持差 CARRAY一個(gè)內(nèi)存塊,就如用

10、malloc分配的一樣。它不知道自己有多大,需要有其它變量指示它的大小。它效率最高,因?yàn)樗痪幋a/解碼。CARRAY主要用來(lái)轉(zhuǎn)輸一個(gè)內(nèi)存塊。 FML/FML32是一種自描述的緩沖區(qū),每個(gè)數(shù)據(jù)域都有標(biāo)識(shí)號(hào)、長(zhǎng)度等信息。FML只通過(guò)函數(shù)進(jìn)行操作,因而有很好的靈活性(帶來(lái)類似于用對(duì)象方法代替直接操作數(shù)據(jù)域的好處)。它支持DDR,一般的DDR實(shí)現(xiàn)都是基于FML的。 STRING是C的字符串類型,以0作為結(jié)束符。但它是支持編碼與解碼的。它顯然不能支持類似UTF16這樣的寬字符集的串(這時(shí)應(yīng)使用MBSTRING),如果必須使用STRING來(lái)傳遞UTF-16的話,可先轉(zhuǎn)換為UTF-8后再傳輸。 VIEW/V

11、IEW32VIEW就是C結(jié)構(gòu)同義詞,只是為了實(shí)現(xiàn)異構(gòu)系統(tǒng)之間的數(shù)據(jù)交換而需要做一些額外的工作。一些工作是開(kāi)發(fā)者做的,另一些是系統(tǒng)內(nèi)部做的。結(jié)構(gòu)可以按字段訪問(wèn)的,因而可以DDR。 XML與CARRAY差別不大。XML比CARRAY多一點(diǎn)的功能是,告訴大家“我的內(nèi)容是一個(gè)XML文檔”。XML支持DDR,但代價(jià)遠(yuǎn)比FML與VIEW大。 MBSTRING是支持多字節(jié)字符編碼的串,這樣的串不再是與C兼容,不能用中的函數(shù)來(lái)操作它們。它的頭部包含有字符集信息。 緩沖區(qū)是動(dòng)態(tài)內(nèi)存,使用前必須用tpalloc函數(shù)分配。 原型:char* tpalloc(char* type,/* 類型名:如STRING,XML

12、*/char* subtype,/* 子類型,適用FML/VIEW*/long size)/* 大小 0, =0為缺省大小 */ 返回值。成功返回緩沖區(qū)指針,失敗返回NULL(0), 雖然分配的失敗機(jī)會(huì)很少,但返回值必須測(cè)試是否為NULL! 例:char* buf = tpalloc(“STRING”,0,0); 注:Tuxedo形成較早,char*多數(shù)是指void*。 緩沖區(qū)可以更改大小,大小更改后,返回的地址可能上新的地址,以后使用新的地址,而不能再用分配前的地址。 原型:char* tprealloc(char* ptr,/* 緩沖區(qū)指針 */long size)/* 新的大小*/注意:

13、返回值不一不等于ptr!不建議使用tprealloc,好的辦法是分配新尺寸的緩沖區(qū),從原緩沖區(qū)復(fù)制數(shù)據(jù)到新緩沖區(qū),刪除原緩沖區(qū)。該函數(shù)比較兇險(xiǎn),使用不當(dāng)有可能導(dǎo)致內(nèi)存泄漏。 緩沖區(qū)可以測(cè)定它的類型、子類型和大小。 原型: 原型:long tptypes(char* ptr,/* 緩沖區(qū)指針 */char* type, /* 主類型 */char* subtype)/* 子類型 */ 返回值:緩沖區(qū)的大小,失敗返回-1 注意:type的長(zhǎng)度為8, subtype的長(zhǎng)度為16 與malloc函數(shù)一樣,tpalloc分配的緩沖區(qū)使用之后也需要釋放。 原型:void tpfree(char* ptr/

14、* 緩沖區(qū)指針 */) 注意:tpforward,tpreturn傳入的緩沖區(qū)是在這些函數(shù)內(nèi)部釋放,因?yàn)橛脩舸藭r(shí)已失去了控制權(quán)。其它場(chǎng)合一律要釋放(如在tpacall/tpcall使用之后),否則將出現(xiàn)內(nèi)存泄漏。ptr=NULL時(shí)函數(shù)什么都不干。該函數(shù)只能用于釋放用tpalloc分配的內(nèi)存。 設(shè)置環(huán)境變量 VIEWDIR32 VIEW定義文件的目錄,多個(gè)UNIX用“:”,Windows用”;”分隔 VIEWFILES32 VIEW定義文件名,多個(gè)用“,”分隔。 建立VIEW定義文件 Type 類型 short, long, float,double, char, string, carray.

15、 Cname 字段名 Fbname FML字段名,當(dāng)存在VIEW與FML相互轉(zhuǎn)換時(shí)設(shè)置 Count 字段出現(xiàn)的個(gè)數(shù),數(shù)組 flag 標(biāo)志。一般不用 Size 大小,只在類型為string和carray時(shí)使用 Null 指示空值。缺省時(shí),數(shù)字類型為(0/0.0),字符為0字符,字符串為空串。示例: #type cname fbname count flag size null float amount - 1 - - 0.0 編譯VIEW定義文件viewc32 -n -d viewdir viewfile-n 使用的是非FML關(guān)聯(lián)的VIEW-d 生成的.h文件與.V視圖文件目錄,缺省為當(dāng)前目錄

16、使用VIEW按一般的C結(jié)構(gòu)使用即可,使用時(shí)包含viewc32生成的頭文件。 下面演示VIEW的使用 Client.cpp 使用VIEW的客戶端 Server.cpp 使用VIEW的服務(wù)端 VIEW的特點(diǎn):效率高,結(jié)構(gòu)固定不可變 FML(Field Manipulation Language)是管理字段的C語(yǔ)言函數(shù)。相對(duì)于固定的VIEW,它的數(shù)據(jù)組織是可變的。它有FML頭信息、索引和字段數(shù)據(jù)。不用了解其內(nèi)部實(shí)現(xiàn),只需調(diào)用操作它的FML函數(shù)即可。 常用函數(shù)在fml32.h中定義,F(xiàn)ML有很多函數(shù),常用的有10個(gè)左右 設(shè)置環(huán)境變量 FLDTBLDIR32 FML字段表文件目錄 FIELDTBLS32

17、 FML字段表文件 定義字段表文件(Field Table File) *base value 字段的起始編號(hào)。1-100,6000-7000表系統(tǒng)保留 Name 字段名 Number 編號(hào) type 類型 與VIEW相同,多了view32, fml32類型 flags 不用設(shè)置 Comments 注釋 FML定義文件例子*base 100# name number type flags commentsSUM 10 float - -AMT 11 double - - 生成頭文件(用于使用FML函數(shù))mkfldhdr32 field_table_file頭文件是字段名宏,例如:#define

18、 SUM (FIELDID32)167772312 /*number 110 type float */頭文件生成之后,我們就可以使用FML函數(shù)了。 增加FML字段int Fadd32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid,/* 字段號(hào),見(jiàn)用mkfldhdr生成的頭文件 */char* value,/* 字段值 */FLDLEN32 len);/* 數(shù)組時(shí)設(shè)置,數(shù)組長(zhǎng)度,非數(shù)組設(shè)為0*/返回值:失敗返回-1 更改FML字段值int Fchg32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid,/* 字段號(hào) */FLDOC

19、C32 occ,/* 相同字段出現(xiàn)的次數(shù),-1作用同F(xiàn)add */char* value,/* 字段值 */FLDLEN32 len);/* 數(shù)組長(zhǎng)度 */返回值:失敗返回-1 得到字段值int Fget32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid,/* 字段號(hào) */int occ,/* 出現(xiàn)次數(shù),首次出現(xiàn)為 0 */char* value,/* 保存取出的值的緩沖區(qū) */FLDLEN32 *maxlen);/* 實(shí)現(xiàn)取出的字節(jié)數(shù) */ 得到字段出現(xiàn)的次數(shù)int Foccur32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 field

20、id);/* 字段號(hào) */ 打印所有字段int Fprint32(FBFR32* fbfr);/* 緩沖區(qū)地址 */ 刪除字段int Fdelete32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid)/* 字段號(hào) */ 返回緩沖區(qū)的大小int Fsizeof(FBFR32* fbfr)/* 緩沖區(qū)地址 */ 同時(shí)利用FML與VIEW的優(yōu)點(diǎn)FML擴(kuò)展性好,傳輸效率高,但不如VIEW使用方便。 在VIEW定義文件中建立與FML的映射設(shè)置FBName為對(duì)應(yīng)的FML字段名 使用轉(zhuǎn)換函數(shù)int Fvstof32(FBFR32* fbfr, char* struct_bu

21、f, int mode, char* view_name);參數(shù)mode 操作模式 FJOIN, FOJOIN, FCONCAT, FUPDATEint Fvftos32(FBFR32* fbfr,char* struct_buf, char* view_name); FML的字段可以是FML或VIEW這一功能非常有用,可以用FML表示非常復(fù)雜的對(duì)象。 提取字符編碼int tpgetmbenc(char* buf, char* enc_name, long flags); 設(shè)置字符編碼int tpsetmbenc(char* buf, char* enc_name, long flags);

22、設(shè)置環(huán)境變量TPMBENCint tuxsetmbenc(char* enc_name, long flags); 讀取環(huán)境變量TPMBENCint tuxgetmbenc(char* enc_name, long flags); 進(jìn)行編碼轉(zhuǎn)換int tpconvmb(char* buf, int* len, char* target_enc, long flags); 加入到應(yīng)用系統(tǒng) 退出應(yīng)用系統(tǒng) 編譯和創(chuàng)建Tuxedo客戶(分Native/WSC) 例子演示 函數(shù)int tpinit (TPINIT *tpinfo); /* TPINIT結(jié)構(gòu),不使用附加特性,設(shè)為NULL*/TPINIT

23、名為T(mén)PINIT的類型緩沖區(qū),成員字段如下: char usrnameMAXTIDENT+2; /* 用戶名 */char cltnameMAXTIDENT+2; /* 客戶名 */char passwdMAXTIDENT+2; /* 口令 */char grpnameMAXTIDENT+2; /* 組名 */long flags;/* 標(biāo)志位, 消息通知的上下文模式 */long datalen;/* data的長(zhǎng)度 */long data;/* 應(yīng)用數(shù)據(jù),此為占位符,長(zhǎng)度可變 */ 檢查是否要求授權(quán)(是否要設(shè)置tpinit) int tpchkauth(void) 返回值:TPNOAUTH

24、 不要求授權(quán)TPSYSAUTH 系統(tǒng)級(jí)授權(quán)TPAPPAUTH 系統(tǒng)級(jí)和應(yīng)用級(jí)授權(quán) 函數(shù)int tpterm(void)返回值:失敗返回-1說(shuō)明:tpterm調(diào)用多次后,除第一次外,以后的調(diào)用什么都做。buildclient -w -o filename -f filenames -l filenames-w 編譯工作站客戶-f 要編譯的文件名或編譯參數(shù),目標(biāo)文件先于tuxedo庫(kù)進(jìn)行連接-l 類同-f,目標(biāo)文件在tuxedo庫(kù)之后進(jìn)連接 看文件simpcl.c 編譯 運(yùn)行 main函數(shù)哪里去了? 系統(tǒng)支持的調(diào)用函數(shù) 服務(wù)例程編寫(xiě)原則 定義一個(gè)服務(wù) 終止服務(wù)處理 構(gòu)建服務(wù)器程序C/C+的程序都有

25、一個(gè)main函數(shù),是程序的執(zhí)行入口。Tuxedo隱含生成main函數(shù),主函數(shù)內(nèi)部插入有非常關(guān)鍵的代碼。主函數(shù)的代碼段類似如下:int main(int argc, char* argv) /* 屏蔽能HANG的信號(hào),設(shè)置SIGTERM連結(jié)BB, 建立隊(duì)列,發(fā)布服務(wù) */if (tpsvrinit(usr_argc, usr_argv) = -1)return -1;while(1) msg = rcv_msg();dispatch(msg);tpsrvdone();return 0; 原型:int tpsvrinit(int argc,/* 參數(shù)個(gè)數(shù) */char* argv);/* 參數(shù)值的

26、數(shù)組 */返回值:如果返回-1服務(wù)器將不能啟動(dòng)。說(shuō)明:參數(shù)是指-之后的應(yīng)用程序(不是服務(wù)參數(shù))argv0是否為程序名?文檔中沒(méi)有說(shuō)明,做一個(gè)實(shí)例測(cè)試。服務(wù)函數(shù)一般用來(lái)初始化程序,如連結(jié)數(shù)據(jù)庫(kù),打開(kāi)日志文件,設(shè)置運(yùn)行環(huán)境、創(chuàng)建服務(wù)對(duì)象等。 原型:void tpsvrdone(void);說(shuō)明:應(yīng)該是tpsvrinit()反向操作。前者分配資源,后者釋放資源。 服務(wù)請(qǐng)求返回必須以tpreturn或tpforward的方式結(jié)束。即使是響應(yīng)tpacall_no_reply,也要調(diào)用tpreturn(TPSUCCESS, 0, 0, 0, 0); 服務(wù)請(qǐng)求返回當(dāng)以tpacall(指示回復(fù))調(diào)用其它服務(wù)時(shí)

27、,必須得到所有回復(fù)后,才能調(diào)用tpreturn/tpforward,或以tpcancel()放棄接收異步調(diào)用的回復(fù)。 一次只處理一個(gè)請(qǐng)求 例程在tpreturn/tpforward返回之前,沒(méi)有機(jī)會(huì)再處理其它請(qǐng)求。 服務(wù)函數(shù)原型:void service(TPSVCINFO* rqst)TPSVINFO表示服務(wù)請(qǐng)求信息,字段如下:char name32;/* 服務(wù)名稱 */long flags;/* 標(biāo)志位,與前端調(diào)用有關(guān),TPTRAN-在事務(wù)中 */char *data;/* 請(qǐng)求緩沖區(qū) */long len;/* 長(zhǎng)度 */int cd;/* 會(huì)話描述符,會(huì)話服務(wù)器有效 */int app

28、key;/* 應(yīng)用鍵值,缺省為-1,用于應(yīng)用定義授權(quán)機(jī)制 */CLIENTID cltid; /* 客戶機(jī)標(biāo)識(shí)號(hào) */void ABAL(TPSVCINFO *transb) struct aud *transv; /* view of decoded message */transv = (struct aud *)transb-data;EXEC SQL declare acur cursor forselect SUM(BALANCE) from ACCOUNT;EXEC SQL open acur;EXEC SQL fetch acur into :bal; if (SQLCODE !

29、= SQL_OK) /* nothing found */strcpy (transv-ermsg,abal failed in sql aggregation);EXEC SQL close acur;tpreturn(TPFAIL, 0, transb-data, sizeof(struct aud), 0);EXEC SQL close acur;transv-balance = bal;tpreturn (TPSUCCESS, 0, transb-data, sizeof(struct aud), 0); 結(jié)束一個(gè)服務(wù)處理有三種方式 調(diào)用tpreturn返回響應(yīng) 調(diào)用tpforward

30、將處理交給下一個(gè)服務(wù) 調(diào)用tpcancel放棄服務(wù)處理 函數(shù):void tpreturn(int rval,/* 返回值 */int rcode,/* 返回代碼 */char *data,/* 返回?cái)?shù)據(jù) */long len,/* 數(shù)據(jù)長(zhǎng)度,只在XML/CARRAY時(shí)設(shè)置*/long flags);/* 標(biāo)志位 */返回值:為應(yīng)用級(jí)設(shè)置。TPSUCCESS,TPFAIL,TPEXIT返回代碼:用戶可以通過(guò)全局變量得到tpurcode標(biāo)志位:目前未使用。Tuxedo很多函數(shù)的末尾參數(shù)都是標(biāo)志位,用于控制函數(shù)的行為。當(dāng)接收超時(shí)時(shí),要調(diào)用tpcancel撤銷回復(fù)鏈路int cd1 =tpacall(

31、sname, (char*)audv, sizeof(struct aud),TPNOTRAN);if (cd1 = -1) if (tpgetrply(cd1, (char*)&audv,&audrl, 0) = -1) if (tperrno = TPETIME) tpcancel(cd1);tpreturn(TPSUCCESS, 0,NULL, 0L, 0);當(dāng)一個(gè)請(qǐng)求還需要被其它服務(wù)處理時(shí),可以轉(zhuǎn)發(fā)請(qǐng)求。函數(shù):void tpforward(char *svc,/* 要轉(zhuǎn)發(fā)到的服務(wù) */char *data,/* 請(qǐng)求緩沖區(qū) */ long len,/* 數(shù)據(jù)長(zhǎng)度 =0

32、表示空長(zhǎng) */long flags)/* 標(biāo)志,目前未使用,設(shè)置為0 */說(shuō)明:執(zhí)行tpforward后,將產(chǎn)生longjmp調(diào)用,其后的代碼不會(huì)再執(zhí)行,服務(wù)進(jìn)程回到起點(diǎn),準(zhǔn)備處理下一個(gè)請(qǐng)求。longjump與C+的析構(gòu)機(jī)制不符,不要在對(duì)象內(nèi)部執(zhí)行fpforward,否則后果不可預(yù)知。 函數(shù):int tpadvertise(char *svc,/* 要發(fā)布的服務(wù)名,不能為NULL */void *func)/* 服務(wù)函數(shù)指針,不能為NULL */int tpunadvertise(char *svc);/* 要取消發(fā)布的服務(wù)名,不能為NULL */注:服務(wù)名的長(zhǎng)度為15個(gè)buildserver

33、 -o filename -f filenames -l filenames -s v -t rrm-o 輸出的程序文件名-f 輸入的文件,目標(biāo)代碼在Tuxedo庫(kù)之前鏈結(jié)-l 輸入的文件,目標(biāo)代碼在Tuxedo庫(kù)之后鏈結(jié)-s 要發(fā)布的服務(wù),多個(gè)服務(wù)使用多個(gè)-s-t 生成線程安全代碼-r 程序要訪問(wèn)的rm類型名 (名稱在RM文件中,該文件指示了使用XA要鏈入的庫(kù)文件)-v 輸出編譯細(xì)節(jié)(verbose)到標(biāo)準(zhǔn)輸出例:buildserver o ACCT f acct.o s NEW_ACCT:OPEN_ACCT s CLOSE_ACCT交易系統(tǒng)的絕大部分交易采用該模型,少量采用會(huì)話模型(如批量

34、和循環(huán)報(bào)文)使用最頻繁的幾個(gè)函數(shù):tpreturn 返回響應(yīng)(只用在服務(wù)例程上)tpcall 同步調(diào)用tpacall異步調(diào)用(包括期望接收回復(fù)和不接收二種)tpforward 轉(zhuǎn)發(fā)請(qǐng)求(只用在服務(wù)例程上)tpgetrply 得到tpacall的回復(fù)int tpcall(char *svc,/* 要調(diào)用的服務(wù)名 */char *idata,/* 輸入緩沖區(qū)指針(請(qǐng)求),不能為NULL */long ilen,/* 輸入長(zhǎng)度,自描述緩沖區(qū)可不設(shè) */char *odata,/* 輸出緩沖區(qū)指針的地址,不能為NULL */long *olen,/* 輸出大小,不能為NULL */long flags

35、)/* 標(biāo)志位 */返回值: 為-1為調(diào)用失敗標(biāo)志位:TPNOTRAN 服務(wù)不參與全局事TPNOCHANGE 輸出緩沖區(qū)的類型不可更改TPNOBLOCK 非阻塞調(diào)用 int tpacall(char *svc,/* 要調(diào)用的服務(wù)名,不能為NULL */char *data, /* 請(qǐng)求緩沖區(qū),不能為NULL */long len, /* 數(shù)據(jù)和長(zhǎng)度 */long flags)/* 標(biāo)志位* /返回值:-1為失敗,成功返回會(huì)話描述符,該描述符由tpgetrply使用。標(biāo)志位:與tpcall相同的部分TPNOREPLY 不期望接收回復(fù),該參數(shù)非常重要,高性能的服務(wù)器往往使用該標(biāo)志進(jìn)行請(qǐng)求推送。in

36、t tpgetrply(int *cd,/* 由tpacall返回的描述符 */char *data,/* 響應(yīng)數(shù)據(jù)緩沖區(qū)指針的地址 */long *len,/* 接收到的響應(yīng)長(zhǎng)度 */long flags);/* 標(biāo)志位 */返回值:出錯(cuò)返回-1標(biāo)志位:類同tpcall(無(wú)TPNOTRAN)的部分TPGETANY 不考慮cd,獲取所有回復(fù)給調(diào)用者消息/* 由tpacall實(shí)現(xiàn)的tpcall */int my_tpcall(char* svc, char* idata, long ilen, char* odata, long* olen, long flags) int cd = tpaca

37、ll(svc, idata, ilen, flags);return (cd = -1)?-1:tpgetrply(&cd, odata, olen, flags);說(shuō)明:調(diào)用者使用要求回復(fù)的tpacall是為了在請(qǐng)求與響應(yīng)到達(dá)之間的時(shí)間段里可以做點(diǎn)別的工作。Void SVC(TPSVCINOF* rqst)char* rbuf = (char*)tpalloc(STRING, 0, 0);if (tpacall(PRINTER, rbuf, rlen, TPNOTRAN|TPNOREPLY)= -1)tpfree(rbuf);tpreturn(TPFAIL, 0, 0, 0, 0);

38、tpfree(rbuf);tpreturn(TPSUCCESS, 0, 0, 0, 0);int tpsprio(int prio, /* 優(yōu)先級(jí)0.100,如flags是指相對(duì)值,此處設(shè)置為0 */long flags); /* 標(biāo)志 TPABSOLUTE 采用絕對(duì)值,這時(shí)prio也給個(gè)值 */返回值:失敗返回-1說(shuō)明:此函數(shù)是對(duì)當(dāng)前請(qǐng)求有影響。可將一些要求盡可以快速響應(yīng)的交易設(shè)置為高的優(yōu)先級(jí),下面的例子為“取款”交易的優(yōu)先級(jí)提高一級(jí)。if (tpsprio(PRIORITY, 0L) = -1) tpreturn(TPFAIL, 0,transb-data, 0L, 0);else if (tpcall(WITHDRAWAL, (char*)reqfb,0, (char*)&reqfb, (long *)&reqlen,TPSIGRSTRT) = -1) tpreturn(TPFAIL, 0,transb-data, 0L, 0); 會(huì)話通訊的特點(diǎn) 會(huì)話建立、應(yīng)用與終止 建立會(huì)話服務(wù)程序 會(huì)話通訊事件 有狀態(tài)的會(huì)話建立后,服務(wù)進(jìn)程就只為建立該會(huì)話的請(qǐng)求者使用,交互狀態(tài)一直有效 服務(wù)進(jìn)程共享度低不適用大量的前端用戶使用,特別是有人參與會(huì)話。如果能用請(qǐng)求/響應(yīng)實(shí)現(xiàn),就不

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論