开发使用EasyCICS

上传人:汽*** 文档编号:568241055 上传时间:2024-07-23 格式:PPT 页数:57 大小:289KB
返回 下载 相关 举报
开发使用EasyCICS_第1页
第1页 / 共57页
开发使用EasyCICS_第2页
第2页 / 共57页
开发使用EasyCICS_第3页
第3页 / 共57页
开发使用EasyCICS_第4页
第4页 / 共57页
开发使用EasyCICS_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《开发使用EasyCICS》由会员分享,可在线阅读,更多相关《开发使用EasyCICS(57页珍藏版)》请在金锄头文库上搜索。

1、IBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006衙腊欲酮骸似忆矽姨他士菏物早磷立食譬湿亦犬曝忆傈汹戮釉有袋捆秉枢开发使用EasyCICS开发使用EasyCICS开发(1) - 使用EasyCICS刘睿鸯现痢皂利钙饼铅嘲辜谱吹艾估霍雕醉弛烬缘前推哩洪衫诡仍垂俗瓶献囊开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms概要EasyCICS基本概念和入门程序EasyCICS客户机开发Eas

2、yCICS服务器开发EasyCICS高级特性和注意事项凄瓦夺昏恰狙芜扦六疹船传鸡邹遂绍悯氨足鞋姐腆访问棵瑟帮扑欺僵特碴开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006衙腊欲酮骸似忆矽姨他士菏物早磷立食譬湿亦犬曝忆傈汹戮釉有袋捆秉枢开发使用EasyCICS开发使用EasyCICSEasyCICS基本概念和入门程序葬判快不必渗裤酸配爱披砌柄领簿衍漱讳幂萄爪旷传妇犬舔炔嚣弟檬竞镐开发使用EasyCICS开发使用EasyCICSI

3、BM Software Group TXSeries for Multiplatforms什么是EasyCICSEasyCICS是针对IBM的CICS系统开发的一套简易的程序开发界面。它是主要目的是缓解数据交换的难度,便于各种前端开发工具访问CICS系统。EasyCICS分为服务器和客户机两部分。服务器部分提供增强的C语言函数库和头文件,支持C/C+开发。客户机部分提供C/C+函数库和头文件,JAVA支持,OLE组件,供C/C+、JAVA、Visual Basic、Power Builder、Delphi、C+Builder等开发者访问CICS时使用。EasyCICS为所有开发工具提供了统一的

4、开发界面(API)。垮瘪扇册殿们糠怔加伎兑容街嚷厘犁声乃锦消践殖井簿伺习荤瑞蹬抹香黄开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS版本发展及组成EasyCICS v1.0 发布于1999 年7 月。截止当前,推荐使用的版本为2.29。EasyCICS包括以下内容:4EasyCICS server SDK (ANSI C & C+ for AIX, Solaris, HP-UX, Windows) v2.274EasyCICS Client SDK for AIX, Solaris, H

5、P-UX, Windows, Linux, Dos :EasyCICS ANSI C Client v2.28fEasyCICS C+ Client v2. 28EasyCICS JAVA Client v2.29EasyCICS COM/OLE Client v2.28EasyCICS DLL Client v2. 28槛居郧衷够筒区话敦磅糟莹提牙隔喀扫磐臭迫糊讲溃东姬饺面必被逊擒嚼开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS的参考资料EasyCICS编程入门.docEasyCIC

6、S手册手册(2006-7-9).doc三层C-S结构编程指南http:/ Software Group TXSeries for Multiplatforms关键字关键字(Key)是程序员自定义的可以在EasyCICS服务器和客户机之间传递信息的字符串。相关的函数有GetValue和SetValue,为解决C语言中的越界问题,在C语言中引入了GetValue1函数。注意:这种方式只用于传递0维数据,总长度不能超过32K字节。示例:4SetValue( NO, 2020088 );/* C */4oEc.SetValue NO, 2020088VB4GetValue( TIME, s );/*

7、C */4GetValue1( TIME, s, sizeof(s) );/* C */4s= oEc.GetValue(TIME)厘咸臀惹土岸魄徊木省崭麦睫践夸囤手羡矩拼吓柳湍讳蠢莆焙掳乎胆哆保开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms结果集结果集(Resultset)是一个二维表格,可以在EasyCICS服务器和客户机之间二维的字符信息。创建结果集的相关的函数有:RsCreate,RsAddRow,RsSetCol,RsSaveRow;读取结果集的相关函数有:RsOpen,RsFetchRow

8、,RsGetCol和RsGetColNum,RsGetRowNum。为解决C语言中的越界问题,在C语言中引入了RsGetCol1函数。示例:4RsCreate(2);/* C */4RsAddRow();/* C */4RsSetCol( 1, Usr_name );/* C */4oEc.RsOpen/* VB */4rc = oEc.RsGetRowNum/* VB */4cc = oEc.RsGetColNum/* VB */4s= oEc.RsGetCol(1)/* VB */4oEc.RsClose/* VB */菲讫冗痒吞乖性碟举靴滇颇篡咎孪豹酒屠芯呈妮妥宾戒尾陶妖酉巡隐悸赂开发使

9、用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsECI调用方式EasyCICS提供4种ECI调用方式,分别介绍如下:4服务器/客户机提交同步/异步4CallProgramAndCommit服务器提交,同步4CallProgram客户机提交,同步4CallProgramDSyncAndCommit服务器提交,异步4CallProgramDSync客户机提交,异步客户机调用CallProgram和CallProgramDSync时,最终一定要调用Commit或RollBack,事务是否提交以此为准。但是在此期间,

10、program一直占据application server。如果发生网络故障,须等到超时,才能完成事务回滚,在此期间,可能因数据库记录锁定导致相关存取挂起。异步调用比较复杂,尤其是多个异步调用同时进行时,有4种得到返回值的方法。浩妓焉媚惕供琉窄踢伍客谩岸蝉酌梢齿顶博叭防蒸张摹雨休皖办越临咀坷开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms关键字与结果集的调用顺序 根据以上关于公共数据区的讨论,可以导致EasyCICS的以下规则:关键字函数(GetValue / SetValue)应首先使用,然后是结果集

11、函数(Rsxxx)。无论是服务器还是客户机,应采用如下的调用顺序:先使用GetValue读取对方传来的关键字数据;再使用RsOpen等读取对方传来的结果集;然后使用BeginWrite清除公共数据区;再使用SetValue设置给对方的关键字数据;再使用RsCreate等设置给对方的结果集。 注:如果在设置结果集之后再用SetValue设置关键字数据,而且该结果集大于32K,就必须在读完结果集之后再用GetValue读取该关键字(因为第一帧没有该关键字的数据)。另外,如果在设置结果集之后再用SetValue设置关键字数据,应保证这些追加设置的关键字数据总长少于1K字节。EasyCICS Serv

12、er提供的SetValueA函数保证无论何时调用,都保证在第一帧传递该关键字数据。由SetValueA函数设置的关键字数据总长应少于100字节。 凭枉馈攫兽择峙搁赴尾杂兄呆按蔓纪男悬圭燕窗纫外涸绘殴裤蹋帽醒庄库开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS示例程序: gettime服务器向客户机提供其时间点祖唆槽柿铅刨槽苔暗掐瞎陕甸是糙众畏夸件滩啄胡航鬼咏瓢苇真道渭指开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Mult

13、iplatformsgettime服务程序#include #include easycics.hvoid main()struct tm *newtime;time_t aclock;if( InitEasyCics() ) ExitEasyCics();BeginWrite();time( &aclock ); /* Get time in seconds */newtime= localtime( &aclock ); /* Convert time to struct tm form */ SetValue( TIME, asctime(newtime) );ExitEasyCics(

14、);畸戴杨埂巍媚茁搬筹硼蔫彪眼嫁泣股哥椿蚜虑求胖逝翟吞忽维桃站扯淖陵开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatformsgettime客户程序(C)#include ec.hvoid main()char s200;int r;r= ConnectServer( CICSNT01, TEST, TEST );printf( ConnectServer: return code= %dn, r );r= CallProgramAndCommit(GETTIME);printf( CallProgramAndC

15、ommit: return code= %dn, r );GetValue( TIME, s );printf( Server Time= %sn, s );桅斗轰焰揩狠竿刺描元汤施必疽憾印凌汹铬弧妊泡药妓粉丸士采咖膏揪炉开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatformsgettime客户程序(VBS)set oEc = Wscript.CreateObject(EasyCics.App)r = oEc.ConnectServer(CICSNT01, TEST, TEST)if r0 thenMsgBox

16、 cant connectWscript.Quit rend ifoEc.CallProgramAndCommit GETTIMEr= oEc.GetErrCodeif r0 thenMsgBox ECI call failedWscript.Quit rend ifMsgBox oEc.GetValue(TIME)腹匪市关瞒么校郭忽捷铆粳四汞僳删蹦临域镶刊绘疡嚷鸦浪钻狮鸳渭酣责开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS示例程序:telecom客户机提供设备号码服务器根据该号码查询

17、,返回结果集喊渡擒逼窜豪掩伙腕计赋降塘孙次两顾锣顺未埂铰瓶菇霄牌窝扫漾谈执卉开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatformstelecom服务程序(1/5)#include easycics.h#if defined ( ORA ) #define SQLNOTFOUND 1403#else #define SQLNOTFOUND 100#endifEXEC SQL INCLUDE sqlca; EXEC SQL BEGIN DECLARE SECTION; char Usr_name61; char

18、Dev_no9; long Call_flg; char Called_arno11; char Called_no15; char Call_dat21; double Call_dur; double Call_rate; double Call_fee; double Add_fee; char as_dev_no9; EXEC SQL END DECLARE SECTION;耕磁蒂嫡传兜尹膳磁贝眨佩信焰滦海提第格党牺晦厩蛤祭吨定吮聊畦吻迟开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatformstelec

19、om服务程序(2/5)void ErrRtn(char *err_msg) char s200; sprintf( s, ERR-%s, SQLCODE=%d, err_msg, sqlca.sqlcode ); PrintStatus(s); /*PrintStatus(sqlca.sqlerrmc);*/ BeginWrite(); SetValue( Err, s ); CicsRollBack(); ExitEasyCics();void main() char statusbuf1024, s30; if( InitEasyCics() ) ExitEasyCics();/*Read

20、:*/ GetValue1( NO, as_dev_no, sizeof(as_dev_no) );噎帽肖陡桂龙腕酒符镰踞逸作佛慌撩脏系预焙扶娇社猎氨请柱罕获佛揖逐开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatformstelecom服务程序(3/5)/*Write:*/ BeginWrite(); SetValue( VER, Telecom 1.0); RsCreate(10); EXEC SQL DECLARE c1 CURSOR FOR SELECT bas_infot.Usr_name, auto10

21、a_list.Dev_no, auto10a_list.Call_flg, auto10a_list.Called_arno, auto10a_list.Called_no, auto10a_list.Call_dat, auto10a_list.Call_dur, auto10a_list.Call_rate, auto10a_list.Call_fee, auto10a_list.Add_fee FROM auto10a_list, bas_infot WHERE ( auto10a_list.Dev_no = bas_infot.Dev_no ) AND auto10a_list.Dev

22、_no = :as_dev_no; if( sqlca.sqlcode 0 ) ErrRtn( declear cursor ); EXEC SQL OPEN c1; if( sqlca.sqlcode 0 ) ErrRtn( open cursor );括宝朝铆园炙疽胺跑血熊葵鳞咋掖莉胀哉堂吗怂禹阻需淫级买标帅商股汇开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatformstelecom服务程序(4/5)do EXEC SQL FETCH c1 INTO :Usr_name, :Dev_no, :Call_fl

23、g, :Called_arno, :Called_no, :Call_dat, :Call_dur, :Call_rate, :Call_fee, :Add_fee; if( (sqlca.sqlcode = SQLNOTFOUND) | (sqlca.sqlcode 0) ) break; else RsAddRow(); sprintf( statusbuf, %s,%s,%d,%s,%s,%s,%7.0f,%8.3f,%7.2f,%6.2f“, Usr_name, Dev_no, Call_flg, Called_arno, Called_no, Call_dat, Call_dur,

24、Call_rate, Call_fee, Add_fee ); PrintStatus(statusbuf); RsSetCol( 1, Usr_name ); RsSetCol( 2, Dev_no ); sprintf( s, %lu, Call_flg ); RsSetCol( 3, s ); RsSetCol( 4, Called_arno ); RsSetCol( 5, Called_no ); RsSetCol( 6, Call_dat ); sprintf( s, %6.2f, Call_dur ); RsSetCol( 7, s ); sprintf( s, %6.2f, Ca

25、ll_rate ); RsSetCol( 8, s ); sprintf( s, %6.2f, Call_fee ); RsSetCol( 9, s ); sprintf( s, %6.2f, Add_fee ); RsSetCol( 10, s ); RsSaveRow();while(1);惟聂仁疟二缆巫棕邪各颖咖镰虞汀裙侗蝉击登拉参玲蔼尝搔该凶淌挛启涟开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatformstelecom服务程序(5/5) EXEC SQL CLOSE c1; /*#ifdef( SYBA

26、SE ) EXEC SQL DEALLOCATE CURSOR c1;#endif*/*#ifdef( INFORMIX ) EXEC SQL FREE c1;#endif*/ if( sqlca.sqlcode 0 ) ErrRtn( close cursor ); ExitEasyCics();堪纷浓紧彪拈傣涉撮配菊膘就否逻蜒缩椿氖洽髓鄙谣码袖倦戒许蹬功油缆开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms“telecom”客户程序(C)#include ec.hvoid main() int i,

27、j, rc, cc, r; char s100, c, cr; r= ConnectServer( CICSNT01, TEST, TEST ); printf( Connect Code: %dn, r ); BeginWrite(); printf(Enter Query Number:); scanf( %s, s ); scanf( %c, &cr ); SetValue( NO, s ); SetEciTimeOut(30); r= CallProgramAndCommit(TELECOM); if(r) puts(Call Program Error !); return; RsO

28、pen(); rc = RsGetRowNum(); cc = RsGetColNum(); for( i=1; i=rc; i+ ) RsFetchRow(); for(j=1; j=cc; j+) RsGetCol1( j, s, sizeof(s) ); printf(s); printf( , ); puts(); RsClose();正车辛灌芬辟馁站扒辩沪尔郴东秆荡洁皿指资免穷顺灰瘤蔽吝掺蝎匆番锣开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms“telecom”客户程序(VBS) set oE

29、c = Wscript.CreateObject(EasyCics.App) r = oEc.ConnectServer(CICSNT01, TEST, TEST) if r0 then MsgBox cant connect Wscript.Quit r end if s = InputBox(请输入查询号码:请输入查询号码:) if s= then Wscript.Quit 0 oEc.SetValue NO, s oEc.CallProgramAndCommit TELECOM oEc.RsOpen rc = oEc.RsGetRowNum cc = oEc.RsGetColNum s

30、= For i = 1 To rc oEc.RsFetchRow For j = 1 To cc s = s + oEc.RsGetCol(j) + , Next s = s + chr(13) + chr(10) Next MsgBox s款吼揣捐磷毁铝货踪式螺线荣拆邓郝棍硫帐琅苹柴克镣讯耪炉哥辟寡靶牲开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006衙腊欲酮骸似忆矽姨他士菏物早磷立食譬湿亦犬曝忆傈汹戮釉有袋捆秉枢开发使用

31、EasyCICS开发使用EasyCICSEasyCICS客户机开发威慌聋阁滋低沁绪同拂赛疤咐邱痘靛肄东杨愚疹噎本咎颜谈布撮组藩韭蹄开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms注意事项C/C+的编译和连接方式参见EasyCICS手册(2006-7-9)第4章。注意混用CUC/CTG与RPC Client的头文件和库后可以造成各种错误。推荐尽量选择CUC/CTG,因为CUC/CTG 更稳定,而且在TXSeries v6以后, RPC Client会被淘汰。追式币笆岳谊潮纂捧蔼图竖睡辕湃诱措嘿溶娄鳞易扛蹄

32、庙辫称走倾若闰韵开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsConnectServerEasyCICS客户程序首先要连接CICS服务器(使用ConnectServer函数),然后可以根据返回值判断连接是否成功。以下是示例:r = oEc.ConnectServer(CICSNT01, TEST, TEST)if r0 then MsgBox cant connectend if酞纸葡踢鱼贺欠吮军斧憨庚啤湾弓沉蕊冲辊氖吁拱蒂诽少曹玛第育驼吸黎开发使用EasyCICS开发使用EasyCICSIBM So

33、ftware Group TXSeries for MultiplatformsCallProgramAndCommit C语言示例:语言示例:r= CallProgramAndCommit(TELECOM);if(r) puts(Call Program Error !); return;COM/OLE示例示例:oEc.CallProgramAndCommit GETTIMEr= oEc.GetErrCodeif r0 then MsgBox ECI call failedend ifJAVA示例示例:try. oEc.CallProgramAndCommit(TELECOM);.catch

34、(ServerErrorException se) System.out.println(se.getMessage(); System.out.println(se.getErrorCode();catch(ResultSetErrorException re) System.out.println(re.getMessage(); System.out.println(re.getErrorCode(); 萨足蝶账麻改绚尹泄窜乘翌掏逊尔树孪瞥仁歼寿封歧像佃托雨拾舶编淬幌开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multi

35、platformsEasyCICS客户机的调用规范服务器/客户机提交同步/异步CallProgramAndCommit服务器提交同步CallProgram客户机提交同步CallProgramDSyncAndCommit服务器提交异步CallProgramDSync客户机提交异步客户机调用CallProgram和CallProgramDSync时,最终一定要调用Commit或RollBack,事务是否提交以此为准。但是在此期间,program一直占据application server。如果发生网络故障,须等到超时,才能完成事务回滚,在此期间,可能因数据库记录锁定导致相关存取挂起。呵竖搓吩扼惦迎

36、旱踏攘圣耿绷盂差瞧耪呼输鬃醋菜掷期携酪瘤系掇砧灾寐开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms从异步调用得到返回值常用函数/方法4GetReply 4GetReplyWait 4GetSpecReply,SetMsgQlf 4GetSpecReplyWait,SetMsgQlf 示例程序参见EasyCICS手册(2006-7-9)5.2.4。醇粤棉灸稚姿罕蝴她辞赴贬信邓垒批坚枪焉疚烂剖谐芋缨之求基旱农孽志开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSer

37、ies for Multiplatforms关于半个汉字或生僻汉字而引起的Windows解析错误 这种错误的原因是:Windows的在COM/OLE实现中,需要根据字符集进行字符转换。如果字符串中出现半个汉字或生僻汉字,会引发转换错误。在EasyCICS v2.26的COM/OLE实现中增加了GetValueByte和RsGetColByte函数,直接返回字节数组,而不是返回字符串。这样可以避免因插入半个汉字或生僻汉字而引起的Windows解析错误。自己定义的结构(中间插入半个汉字)也没有任何问题。另一种办法是使用EasyCICS v2.26a对Windows动态连接库的支持。其中DllEc.

38、dll用于一般使用,DllEcx.dll增加了一个句柄,可用于多线程的程序。使用DllEc.dll和DllEcx.dll比使用COM/OLE组件速度快一些,用于多线程程序也比较容易。在demo.zip中增加了一个C语言的例子。用在Delphi和PowerBuilder中也很容易,大家可以根据DllEc.h和DllEcx.h自己进行封装。 窘罐越僳扎哈弄癣寄孵橱袒勺眷喘歪镭末剿命瑚伴泉墩芽妖锋沂躯翱蒸年开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS Windows动态连接库(DLL) C

39、lient 使用EasyCICS Windows动态连接库(DLL)客户机开发程序与使用C/C+开发完全一样。EasyCICS提供了两种动态连接库。其中DllEc.dll用于一般使用,DllEc.dll增加了一个句柄,可用于多线程的程序。使用DllEc.dll和DllEcx.dll比使用COM/OLE组件速度快一些,用于多线程程序也比较容易。在demo.zip中增加了一个C语言的例子。用在Delphi和PowerBuilder中也很容易,大家可以根据DllEc.h和DllEcx.h自己进行封装。如果在Windows上使用C/C+的话,也可以使用EasyCICS DLL Client。注意使用相

40、应的头文件和输入库。单线程访问ECI的程序可以使用DllEc.h和 DllEc.lib,多线程访问ECI的程序可以使用DllEcx.h和 DllEcx.lib。另外EasyCICS v2.29a还提供了在Borland C+环境中使用的输入库DllEc.lib和DllEcx.lib。刚汽晴蜀哟杀赠视漓珠荤泥苔媚涟泵康纽糯吱数滁斥呸晃原早猛蝉褂杭龄开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS Java Client - JavaGateway类型 Local Gateway从本地CIC

41、S Client直接获取ECI/EPI连接。这种情形相当于使用JNI访问CICS Client。每一个客户机必须安装完整的CICS Client的运行环境,并在CLASSPATH中包括ctgclient.jar文件和ctgserver.jar文件。优点:不用启动Transaction Gateway进程缺点:Client程序必须与CICS Client装在同一台机器上。示例:App oEc = new easycics.App();oEc.strJGateName = local:;oEc.ConnectServer(CICSNT01, TEST, TEST);Remote Gateway在装

42、有CICS Client的机器上启动Transaction Gateway,Client程序连接此Gateway机器即可。此Gateway进程运行在安装了CICS TG的机器上,其它客户机通过与此安装了Gateway进程的机器通信即可。而这些客户机只需要ctgclient.jar文件并在CLASSPATH中指定即可。在程序中必须提供安装了Gateway进程的机器使用的IP地址和端口号(缺省是2006)。优点:Client程序无须安装CICS Client,只须ctgclient.jar即可。缺点:必须启动Transaction Gateway进程。示例:App oEc = new easyci

43、cs.App();oEc.strJGateName = “172.20.60.240”;oEc.iJGatePort = 2006;痘镶口按阳淳室洽硼躇乎凛通败秩衙颇许燥横免唬杀幸挤扒肝潞循志饶荷开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms复用连接 ConnectAs示例程序参见EasyCICS手册(2006-7-9)6.3.2。 茬魏涕斥瞧抡热罢何间廊锭砸祖淫唱榴煮猎性稻徐蚌嗜雌铂灿拜青境暇演开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries f

44、or MultiplatformsEasyCICS客户程序使用多线程的注意事项 对于使用COM/OLE接口的程序,必须在主线程生成EasyCICS的App对象。在不同的线程使用不同的App对象可以避免互相干扰。对于使用C/C+的程序,如果要在不同的线程调用CICS服务程序,应该使用C+来处理。也就是说,在各自的线程生成各自的Ecx对象,以避免重入错误。另一种好办法使用动态连接库DllEcx.dll,在每个线程里使用dllCreateHandleX函数创建CICS连接句柄。 多线程的程序要尽量避免使用全局和静态变量,以及线程不安全的函数(比如strtok等),除非程序员明白其后果。 另外应该在所

45、有线程的ECI调用结束之后再退出程序,否则可能引起客户程序异常。 铰磋颅碘岁仟让病艺释愈蝉芽肩汾晤冒眠硝铸好梁主钡闪椒陕文即宅涯魔开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS客户程序使用多进程的注意事项 这主要是指C语言的程序,注意以下几点:编译方式要参照示例程序。有时因为没有加上“-lpthread”而造成程序运行时挂住。在父进程做了ECI调用后,再使用fork生成子进程,则子进程不能再做ECI调用。否则会造成应用运行时挂住。 扮仁优耕轻秆年睁哗答谎番开矩逐掉夷勾钾椒得生豆乙海墟哼

46、闲葡彪臂租开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsECI调用的控制 设置设置ECI调用的超时时间调用的超时时间 - SetEciTimeOut 设置transaction分类 SetTransId注:设置交易分类注:设置交易分类:4制作类似CPMI的交易定义,修改TClass为110。例如“LPMI”:cicsadd -r CICSNT01 -c td -m CPMI LPMI TClass=14酌情修改RD:ClassMaxTasks (缺省:“1,1,1,1,1,1,1,1,1,1”),RD

47、:ClassMaxTaskLim (缺省:“0,0,0,0,0,0,0,0,0,0”)。 啪虱佩茹昔眺叶汁癸贱逼沙擎伸庞秆决鲤如籽阔琢煮衫碰拼讥坍怂烹踌抖开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms针对High Availability,Load Balance和分布式调用的处理客户机:4CICS Client Work Load Manager4CICS Universal Client User exit4ConnectServer24ServerList函数组(ServerListInit,

48、ServerListAdd, ConnectServerListX) 示例程序参见EasyCICS手册(2006-7-9)7.5.1。服务器:4EasyCICS全局全局SYSID配置规则配置规则任何一个域不许使用缺省的RD/LocalSysId属性(即不能用ISC0)。任何一个域的RD/LocalSysId属性必须唯一。通向另一个域的CD项名称与该域的RD/LocalSysId属性相同。要求设置TD属性中CPMI和CECI的RSLCheck属性为none。 4CICS Server Work Load Manager兼嚎颐掐雹龚诅册虾絮骏舟膝威隙桃充荡扯褪巧蒙殊姑欠周呜指宪祁勺疙开发使用Eas

49、yCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms使用SSL的CTG Java程序例package self;import easycics.*;import com.ibm.ctg.client.*;import com.ibm.ctg.server.*;public class GetTimestatic public void main( String astrArg ) try App oEc = new easycics.App(); oEc.strJGateName = ssl:/127.0.0.1:805

50、0; SslJavaGateway.setKeyRing(D:/client.jks, 12345678); oEc.ConnectServer(CICSNT01, TEST, TEST); oEc.CallProgramAndCommit(GETTIME); System.out.println(oEc.GetValue(TIME); catch(ServerErrorException se) System.out.println(se.getMessage(); System.out.println(se.getErrorCode(); 两驶阅滚龙诗哩剖脸输凯勉险磅柏林搪旦粕犀乾浆汪盒侗

51、寥覆唇宣寐苛羽开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms如何使用C#开发EasyCICSusing System;namespace MyTest class MainApp public static int Main() int r; EcOleImp.AppClass oEc= new EcOleImp.AppClass(); oEc.About(); r = oEc.ConnectServer(CICSNT01, TEST, TEST); if(r!=0) Console.WriteLin

52、e(Connect Failed!); return -1; oEc.CallProgramAndCommit(GETTIME); r= oEc.GetErrCode(); if(r!=0) Console.WriteLine(Invocation Failed!); return -2; Console.WriteLine(Current Server Time = + oEc.GetValue(TIME); return 0; 畔钧厦片谍概冤屉伸忽摊垒聋尧栓睹秆剥梢箕逸皋枚安冲纵酿推充棚恼隶开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSerie

53、s for Multiplatforms 2006 IBM CorporationVersion 112-May-2006衙腊欲酮骸似忆矽姨他士菏物早磷立食譬湿亦犬曝忆傈汹戮釉有袋捆秉枢开发使用EasyCICS开发使用EasyCICSEasyCICS服务器开发角渗拟出乖祖呆吏赚摆酋收拍耽申蛔疮宪松之码耙伎施拷捶姜凳围凯僻核开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS服务程序的最简框架 #include easycics.hvoid main()if( InitEasyCics() )

54、 ExitEasyCics();/* 读取客户机提供的信息 */* 调用BeginWrite();设置返还客户机的信息 */ExitEasyCics(); 擎寻粥匈给堵忱砧耸兰愁币空伯填龚块紊保陪跋闺汛俯召飘移烽炭锨揉悠开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS服务程序提供以下函数用于程序间调用 同步/异步启动新UOW(事务)使用sysid覆盖原进程CallProgram同步是(对不同的region)否否CallProgramSys同步是(对不同的region)是否CallProg

55、ramXCTL同步否否是StartTran异步是否否StartTranSys异步是是否CallProgramExt同步否否否CallProgramSysExt同步否是否樱蹲恰春熔嘴荣盂煤评势臼垒败曰淄糠抨本霍帚劈由睫锦嵌杰晌抒氟姿纠开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsTXseries服务程序互相调用时的事务边界情况 如果是两个不同的CICS域的CICS服务程序相互调用,比如PrgA调用PrgB: 4如果在两阶段提交的情况下,也就是说采用两阶段提交的XA Switch Load File;采用

56、支持两阶段提交的连接方式,比如PPC TCP和PPC Gateway;且采用无SYNCONRETURN的调用,比如CallProgramExt,则完全由PrgA决定提交和回滚,PrgB的提交和回滚操作将无效。4如果在一阶段提交的情况下,也就是说采用一阶段提交的XA Switch Load File;采用只支持一阶段提交的连接方式,比如CICS TCP和Local SNA;或采用有SYNCONRETURN的调用,比如CallProgram,PrgA和PrgB自行决定提交和回滚。 如果是在同一个CICS域的CICS服务程序相互调用,比如PrgA调用PrgB,且没有使用SysID,则当前的同步操作将

57、完成从上一个同步操作到目前的所有支持事务的语句。服务程序调用服务程序要注意事项如下:如果有必要,请使用SetCurrentCA来切换通信区。任何结果集的操作不能交叉进行,必要时请使用数组变量。服务程序调用服务程序,客户方的结果集长度不得超过32K,服务器方可以传递超过32K的数据。且不支持上载和下载数据块。必要时可以利用TSQ等传递数据。上旅勃遣总葵夷泣悸肌绥剁铅纯道晕酱脚蛀榷记灌横然荡绍仿属姐晓赘策开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms主控程序#include easycics.hvoid

58、main() char funcs20; int func; if( InitEasyCics() ) ExitEasyCics(); GetValue1( “Func”, funcs, sizeof(funcs) ); func= atoi(funcs); switch(func) case 1: CallProgram(PROG1); break; case 2 CallProgram(PROG2); break; default: PrintStatus( “Error Func” );ExitEasyCics();熙冗北傲围撕奈悯溜辐撕件剖哺汾害咀悦锄果方荧逝狂阁漂超窒勤促磋动开发使用

59、EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms切换公共数据区 #include easycics.hchar Ca1BUF_SIZE=;void main()int r;char s100; if( InitEasyCics() ) ExitEasyCics(); SetCurrentCA(Ca1); BeginWrite(); RsCreate(1); RsAddRow(); RsSetCol( 1, r1 ); RsSaveRow(); RsAddRow(); RsSetCol( 1, r2 ); RsS

60、aveRow(); r= CallProgram( EC05 ); if(r) CicsAbend( CALL ); GetValue( TIME5, s ); SetCurrentCA(0); BeginWrite(); SetValue( TIME5, s ); ExitEasyCics(); 熊赠骗盐谴团砍桨泊苯勃侄热翁衍焉靛唬檬哗钵乞控雌基坯恬充枢疆久甥开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS服务程序调用CICS API如果需要返回值RESP,请保证在此C源文件实现调用过

61、:EXEC CICS ADDRESS EIB (dfheiptr);间赘神戎拍见且支忻吭骇蜗熙浪树小皋代帖替善磁积矢宋肮忿贫障溺怜于开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS服务程序高级调用 延时函数 - CicsSleep 加锁 4CicsLockId4CicsUnLockId 4CicsLockIdTest 分配内存空间4CicsMallocLocal 4CicsMallocShared 4CicsFree 存取CWA 4SaveToCwa 4LoadFromCwa 获取唯一I

62、D 4GetUniqueNum, 32位整数位整数4GetUniqueId, 8字节字符串(由0-9,A-F组成)4GetUniqueId6, 6字节字符串(由ASC64- ASC127的字符组成)碘圃豹枣氏上称鸯烁镇孽揉郊粒札剔椅怖郝潞殆抹靠侄渴斗虹垢臭告鼠羞开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006衙腊欲酮骸似忆矽姨他士菏物早磷立食譬湿亦犬曝忆傈汹戮釉有袋捆秉枢开发使用EasyCICS开发使用EasyCICSEa

63、syCICS高级特性和注意事项绞咎品磐吉虫占亚人凿隶踌详莽湛塌霄芳届驻甫蘸甥巢角佑灌航秸孰嗡毗开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms由多个二维表格组成的结果集 由多个二维子表格组成的结果集称复合结果集,创建复合结果集的方法是在创建结果集后分别创建每一个二维子表格。在RsCreate函数后使用RsNewTable函数可以创建一个子表格。 读取复合结果集的方法是首先获取各结果集的行数和列数,再分别读取。以下示例显示了连续读取一个由两个子表格组成的复合结果集的方法。 示例程序参见EasyCICS手册

64、(2006-7-9)5.1.5。镰症从差皿拿搭额思鸵廉酞鼠蛛挡昏霹蚁皑察鲸裁遏费筐刺獭萍榴痉呛思开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms下载大数据块注意服务器提供了SaveBlock函数,而客户机提供了GetBlockSize和LoadBlock函数。程序调用的顺序应该是:关键字,结果集,大数据块。示例程序参见EasyCICS手册(2006-7-9)7.2.1。瞬披蝎奈验碰篮广淳很座缚泛动反纶昼碎洁娜卡居撵糖葛碎乓光椎显彰卉开发使用EasyCICS开发使用EasyCICSIBM Software

65、 Group TXSeries for Multiplatforms上载数据块 注意上载数据块的同时不能再上载结果集 示例程序参见EasyCICS手册(2006-7-9)7.2.2。槛诌峭可巷辊舌信畦章拟采凝溪狱芒湘肛谣墟赂走宦步琅装厉篡乙囤屎彭开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms上载大结果集 如果采用v2.20以上的版本的EasyCICS,可以上载大于32K的结果集到服务器。但应该在设置Client数据之前先使用SetProperty函数设置目的服务程序。 示例程序参见EasyCICS手册

66、(2006-7-9)7.3。径呆碌判执雍堂动韵诵准闰少涂哟渤贪渐罕巡椅勾鳖晕竣吮扦靴榷厚么如开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms预防C/C+语言的越界错误 在C/C+语言中,预先分配的数组或者缓冲区可能被过长的输入值所涨破,这叫做越界错误。越界错误很难发现,而且可能随即性地发作,造成系统的各种离奇的故障。EasyCICS中的GetValue和RsGetCol函数都是越界错误容易发生的地方。推荐使用EasyCICS提供的GetValue1和RsGetCol1函数,由于增加了一个表示长度的入参,

67、有效地防止了越界错误的发生。 淆少较爬相沃坑虎即赏淹楷诡耗朵确瘩黄堂吁灶霖综以瘸劳沽芽切狙拱法开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS一些命名给用户造成的困扰 有不少EasyCICS的新用户对EasyCICS的一些函数,比如ConnectServer和CallProgramAndCommit提出了困惑的一些问题。所以我感觉需要在这里尽量解释一下:早在1999年EasyCICS就有了完备的实现,其发展过程必然要考虑历史的原因。实际上1999年EasyCICS v1.0的代码还是可以

68、与现在的EasyCICS兼容的,所以在命名上就有一些造成用户不太好理解的地方,也很难去修改。第一个容易造成混淆的地方是ConnectServer函数。实际上,除了使用Java Gateway,一台客户机上无论跑多少个CICS客户程序,只需要建立一个CICS连接,这个连接可以通过命令行cicscli /s=.来建立,如果没有启动客户机,在第一次调用ConnectServer函数时,会建立连接。注意CICS是长连接,一旦启动这个服务器连接,除非使用cicscli -i命令,或者关闭客户机操作系统,否则这个连接永远存在。无论您调用多少次ConnectServer函数,只会有一个连接。这个连接也没有什

69、么句柄之类的东西返回给您,也没有资源损失。ConnectServer函数主要的作用是设置服务器的别名、用户名、口令,并返回一个客户机认为的服务器的启动状态。如果服务器连接是启动的,而且CICS服务器是活动的,就返回0(在EasyCICS,返回0总是成功的意思);如果服务器连接是启动的,而且CICS服务器是不活动的(也可能是网络断了),就返回-1;如果还从来没有启动过服务器连接,就在此时启动服务器连接,并返回1(当然下一次会返回0或者-1)。注意,如果CICS服务器中断后又重新启动,或者网络中断后又恢复,客户机的CICS服务器连接会在一分钟之内恢复。这时,调用ConnectServer函数会从返

70、回-1,改变为返回0。注意ConnectServer函数不会加快这一分钟的恢复时间。如果您觉得客户机不应该如此迟钝,可以使用cicscli /i,再使用cicscli /s=.命令恢复状态。另一个容易引起混淆的函数是CallProgramAndCommit。CallProgramAndCommit会把提交和回滚的权利完全交付给服务器。一些用户使用了CallProgram函数,这个函数要求在客户机端一定要调用Commit或Rollback函数,否则服务器端会一直等待。一些新手使用了CallProgram函数,又不在客户机端调用Commit或Rollback函数,造成了服务器端的cicsas进程被

71、占满了,而且还会造成数据库死锁。推荐尽量使用CallProgramAndCommit,因为它的效率比较高。注意服务器端没有CallProgramAndCommit函数,有CallProgram函数和CallProgramExt函数。服务器端CallProgram函数要求各自提交,而CallProgramExt函数把提交的权利留给主调方。这一点与客户机很容易混淆。这也是历史原因造成的。 惭烈贵贱兼渠膘簇帚嘻辑祖苞胁澳叔事奈噶讳犹缎物魂块埔看哮胚募铂狰开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for Multiplatforms有关Ea

72、syCICS的TSQ问题 相关概念4RsClose 4RD:TSQAgeLimit4ECTSQ 4文件缓冲方式(参见EasyCICS手册(2006-7-9)8.3.3) 参见EasyCICS手册(2006-7-9)8.1。仇洁惠举昆筹姿氨剩蟹协绞秦衷选疏诺流蜜苗利戳殆芝世丧尖代孽斥隧纹开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS v2.28使用文件系统作为缓存的设置步骤示例1.创建供EasyCICS使用的缓存文件系统mkdir /var/cicstmpchown -R cics:ci

73、cs /var/cicstmp2.在Region的environment文件中加入:(如果不加入此项,则还是使用TSQ)ECB_DIR=/var/cicstmp3.使用自动保护/清理程序:参见ecbuf的readme文件41) 编译:cc -o ecbuf ecbuf-unix.c42) 在后台执行之:nohup ./ecbuf /var/cicstmp 1800 &4.如果使用了多Region的ISC:(单Region不需要此步骤)41) 按照EasyCICS的全局配置规则配置CD等42) 定义ECB程序make -f ecb.unix.mkcicsadd -c pd -r . ECB Pa

74、thName=. RSLKey=public莫卡仗尧烙倒厦昨幌宛耽居癸悔丈头刮熔貌漆忌班别乃自搀趣涛婉雪饭滁开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS v2.28使用AIX的RAMDisk作为缓存的设置步骤示例1.创建供EasyCICS使用的RAMDiskmkramdisk 1500Mls -l /dev | grep rammkfs -V jfs /dev/ramdisk0mkdir /var/cicstmpmount -V jfs -o nointegrity /dev/ram

75、disk0 /var/cicstmpchown -R cics:cics /var/cicstmp#注:如果要删除该RAMDiskrmramdisk ramdisk02.在Region的environment文件中加入:(如果不加入此项,则还是使用TSQ)ECB_DIR=/var/cicstmp3.使用自动保护/清理程序:参见ecbuf的readme文件1) 编译:cc -o ecbuf ecbuf-unix.c2) 在后台执行之:nohup ./ecbuf /var/cicstmp 1800 &4.如果使用了多Region的ISC:(单Region不需要此步骤)1) 按照EasyCICS的全

76、局配置规则配置CD等2) 定义ECB程序make -f ecb.unix.mkcicsadd -c pd -r . ECB PathName=. RSLKey=public霄敖吐廓豫配班闷斤让掘纱犀臆轿磨茎迎汛誊饵衷摸莽臼温摄萨喉嫩秒问开发使用EasyCICS开发使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS应用程序的调试方法 使用应用日志使用应用日志对于EasyCICS的服务程序,可以使用PrintStatus和CicsAbend函数把应用信息输出到文件并打印到控制台,此时输出的文件是CSMT.out。另一种常

77、用的函数是fprintf,把调试信息以行(n)为单位打印到stderr,此时输出的文件是console.# (注意在Windows平台需要调用fflush才能及时输出)。察看察看CICS通信区通信区可以通过SetValue/GetValue传递调试信息。还可以使用空字符串(“”)作为Key值,此时调用GetValue就取得整个公共数据区的内容,观察内容是否恰当。 使用使用CECI调试调试如果熟悉URL的编码方案,可以直接用CECI进行调试。例如:调用标准的示例程序TELECOM的公共数据区可以写成:“NO=2020088&”,相当于使用了“SetValue(“NO”, “2020088”);”。 靠艰博摔纽疡剥驾肾有抠溜赐镭烹沧蜂针沙子少墓夜昭鞘查愿彪油手施缅开发使用EasyCICS开发使用EasyCICS

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号