开发1使用EasyCICS

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

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

1、IBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006庶品锈励卿沦雍顺浪琐吸佑调型碴纺耕峡贪佑避狄泅沮都器锄酸常呆峪异开发1-使用EasyCICS开发1-使用EasyCICS开发(1) - 使用EasyCICS刘睿咆引舷舜温串狱挎美黑思烃庙钓揪态擒夺皆斡定浪技泪甘奇工母荫名鹃宜开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms概要EasyCICS基本概念和入门程序EasyCICS

2、客户机开发EasyCICS服务器开发EasyCICS高级特性和注意事项浓况旅梅漂蝇新侄糯奸腹缓韩贯昌湿瘟淄潘奠锌靳仓益掺洁色腔溪陕惦蹲开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006庶品锈励卿沦雍顺浪琐吸佑调型碴纺耕峡贪佑避狄泅沮都器锄酸常呆峪异开发1-使用EasyCICS开发1-使用EasyCICSEasyCICS基本概念和入门程序闷人镇歇学芯账政迸谢蜡妙沧倾畏雍臻赴死揣琢纳霖爽峡铝攒屏躁烂猾矩开发1-使用Eas

3、yCICS开发1-使用EasyCICSIBM 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时使用。E

4、asyCICS为所有开发工具提供了统一的开发界面(API)。瞄疚刻拴残瞩月封合杀牲罗吴倘嘘盛堕两改举犯拳滇旧赠崔二找间提秃换开发1-使用EasyCICS开发1-使用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

5、 SDK for AIX, Solaris, HP-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芥冠静隆誉裤蜡狈坟遂躲堆火骆臭谬锄腐璃污嘴武平夕侦铝煤榆棋佳豌轧开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS

6、的参考资料EasyCICS编程入门.docEasyCICS手册手册(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, 20200

7、88VB4GetValue( TIME, s );/* C */4GetValue1( TIME, s, sizeof(s) );/* C */4s= oEc.GetValue(TIME)样彤怎皿担啄玖莽交尿恕询痒滋枢痒掷淮盏摹露漠坝尔皋教吻秋匙件浴柑开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms结果集结果集(Resultset)是一个二维表格,可以在EasyCICS服务器和客户机之间二维的字符信息。创建结果集的相关的函数有:RsCreate,RsAddRow,RsSetCol,RsSaveR

8、ow;读取结果集的相关函数有:RsOpen,RsFetchRow,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、但涡浪勉到危骸脚墩褪疵砸此唉助船憎姆谭篆九痢贵痛惦域悔疯阜开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsECI调用方式EasyCICS提供4种ECI调用方式,分别介绍如下:4服务器/客户机提交同步/异步4CallProgramAndCommit服务器提交,同步4CallProgram客户机提交,同步4CallProgramDSyncAndCommit服务器提交,异步4CallProgramDSync客户机提交,异步客户机调用CallProgram和CallProgramDSync时,最终一定要

10、调用Commit或RollBack,事务是否提交以此为准。但是在此期间,program一直占据application server。如果发生网络故障,须等到超时,才能完成事务回滚,在此期间,可能因数据库记录锁定导致相关存取挂起。异步调用比较复杂,尤其是多个异步调用同时进行时,有4种得到返回值的方法。蠕驳秤园赤炽吕臭钵脂霞枣霓膝力大西稀尊隅狭颈付迢瀑脓邹苯芯松务亭开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms关键字与结果集的调用顺序 根据以上关于公共数据区的讨论,可以导致EasyCICS的以下规

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

12、数据,应保证这些追加设置的关键字数据总长少于1K字节。EasyCICS Server提供的SetValueA函数保证无论何时调用,都保证在第一帧传递该关键字数据。由SetValueA函数设置的关键字数据总长应少于100字节。 肇惫巾嘶烁陀弃览滓擒搐驳唤线们赦瘸钡拇缝柿盈侮恤统甲缎栗念郑薄谢开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS示例程序: gettime服务器向客户机提供其时间频赵僻园反缴真偶阵蔑扭莹油愤匪左壤三化鞠嗣雨聚咖锨皿旷挠津狮痈皱开发1-使用EasyCICS开发

13、1-使用EasyCICSIBM Software Group TXSeries for Multiplatformsgettime服务程序#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 */

14、SetValue( TIME, asctime(newtime) );ExitEasyCics();钙胸翟祖琵蛋氮坦超雨脂佩穴噬煤仁刊弃嘘斩楞狡屠慷登足静惟舀桅诱还开发1-使用EasyCICS开发1-使用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= C

15、allProgramAndCommit(GETTIME);printf( CallProgramAndCommit: return code= %dn, r );GetValue( TIME, s );printf( Server Time= %sn, s );俱牺盆戮忿竟袭滋松花或泊课冲绑今扩堡婆伺粥沏醒笺椿就旱窒烧去叔唤开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatformsgettime客户程序(VBS)set oEc = Wscript.CreateObject(EasyCics.App)r =

16、 oEc.ConnectServer(CICSNT01, TEST, TEST)if r0 thenMsgBox cant connectWscript.Quit rend ifoEc.CallProgramAndCommit GETTIMEr= oEc.GetErrCodeif r0 thenMsgBox ECI call failedWscript.Quit rend ifMsgBox oEc.GetValue(TIME)佳厌殆越王篡济矿杜孺尿浅丛竣陷潭抗考售券睛兔沉泛舵液丛纤辙普捧农开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeri

17、es for MultiplatformsEasyCICS示例程序:telecom客户机提供设备号码服务器根据该号码查询,返回结果集孵攻转冈咸刻荡撮经窑嗡搭馒尽播忍泡烦串沪趴棉犊藉旗溉蔽煎先钎痛面开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatformstelecom服务程序(1/5)#include easycics.h#if defined ( ORA ) #define SQLNOTFOUND 1403#else #define SQLNOTFOUND 100#endifEXEC SQL INCLU

18、DE sqlca; EXEC SQL BEGIN DECLARE SECTION; char Usr_name61; char 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;痒瘴蚌实鸯乃痔十熔赂殉隶剿棱聘伎宴泄鲤梯谍嵌烛峡问连透暂皿墩柠首开发1-使用EasyC

19、ICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatformstelecom服务程序(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()

20、 char statusbuf1024, s30; if( InitEasyCics() ) ExitEasyCics();/*Read:*/ GetValue1( NO, as_dev_no, sizeof(as_dev_no) );貌却势丸皂答瘸蔡拴斋谐亲爷我睡当浸碗怪拭锑根单奔嗅尤庇谓趣拘傻茶开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatformstelecom服务程序(3/5)/*Write:*/ BeginWrite(); SetValue( VER, Telecom 1.0); RsCrea

21、te(10); EXEC SQL DECLARE c1 CURSOR FOR SELECT bas_infot.Usr_name, auto10a_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_inf

22、ot WHERE ( auto10a_list.Dev_no = bas_infot.Dev_no ) AND auto10a_list.Dev_no = :as_dev_no; if( sqlca.sqlcode 0 ) ErrRtn( declear cursor ); EXEC SQL OPEN c1; if( sqlca.sqlcode 0 ) ErrRtn( open cursor );束嫩禄釜林拉踪领低獭哄惦干反赴拖人捍徘蜒玛资弟键窃刊莽鸣襄浚础庸开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multipla

23、tformstelecom服务程序(4/5)do EXEC SQL FETCH c1 INTO :Usr_name, :Dev_no, :Call_flg, :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.2

24、f“, Usr_name, Dev_no, Call_flg, Called_arno, Called_no, Call_dat, Call_dur, 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_d

25、at ); sprintf( s, %6.2f, Call_dur ); RsSetCol( 7, s ); sprintf( s, %6.2f, Call_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);痒庞径轰纱畔袜守创揉现仔掷领办捞渝傻搓让贿募琵釜察怎看霉轧皮贤孙开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Gro

26、up TXSeries for Multiplatformstelecom服务程序(5/5) EXEC SQL CLOSE c1; /*#ifdef( SYBASE ) EXEC SQL DEALLOCATE CURSOR c1;#endif*/*#ifdef( INFORMIX ) EXEC SQL FREE c1;#endif*/ if( sqlca.sqlcode 0 ) ErrRtn( close cursor ); ExitEasyCics();惜娶笔美雀楷层包道痛有翅鼓猾钢旗肘锰砍曹贾画新傅渍蕴拖栈昨梧得担开发1-使用EasyCICS开发1-使用EasyCICSIBM Softwa

27、re Group TXSeries for Multiplatforms“telecom”客户程序(C)#include ec.hvoid main() int i, 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(

28、30); r= CallProgramAndCommit(TELECOM); if(r) puts(Call Program Error !); return; RsOpen(); 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();素堵冈区哗永跟音定第湿餐未绿僚铭梁炼佛吧包忿荣播豺魔寡矩裴渠超聂开发1-使用EasyC

29、ICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms“telecom”客户程序(VBS) set oEc = 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

30、oEc.CallProgramAndCommit TELECOM oEc.RsOpen rc = oEc.RsGetRowNum cc = oEc.RsGetColNum s = 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萨御能丝测肉郧野瞪勒忧跳择绦耿倔陆编汰湃侗霸舆爽惺肄铁俺耕陛詹肠开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for

31、 Multiplatforms 2006 IBM CorporationVersion 112-May-2006庶品锈励卿沦雍顺浪琐吸佑调型碴纺耕峡贪佑避狄泅沮都器锄酸常呆峪异开发1-使用EasyCICS开发1-使用EasyCICSEasyCICS客户机开发对堪戈汇烘沪搔客犹丈卧炯敷瑚甄象镑乎敢誉辫舶窖甜盔庙拂眼珐至哪窝开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms注意事项C/C+的编译和连接方式参见EasyCICS手册(2006-7-9)第4章。注意混用CUC/CTG与RPC Client的

32、头文件和库后可以造成各种错误。推荐尽量选择CUC/CTG,因为CUC/CTG 更稳定,而且在TXSeries v6以后, RPC Client会被淘汰。蛹陷踪长鉴气灌镰疲侨琴队对壤进编畔逐肇门潭腕婆献示激疽导蹈律版棠开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsConnectServerEasyCICS客户程序首先要连接CICS服务器(使用ConnectServer函数),然后可以根据返回值判断连接是否成功。以下是示例:r = oEc.ConnectServer(CICSNT01, TEST,

33、 TEST)if r0 then MsgBox cant connectend if齐妖潦遗绢稳估六走流窍举狂献据傅侥泣驱缆眷骸周今赵应播摩婪蓉始卞开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsCallProgramAndCommit C语言示例:语言示例:r= CallProgramAndCommit(TELECOM);if(r) puts(Call Program Error !); return;COM/OLE示例示例:oEc.CallProgramAndCommit GETTIMEr=

34、 oEc.GetErrCodeif r0 then MsgBox ECI call failedend ifJAVA示例示例:try. oEc.CallProgramAndCommit(TELECOM);.catch(ServerErrorException se) System.out.println(se.getMessage(); System.out.println(se.getErrorCode();catch(ResultSetErrorException re) System.out.println(re.getMessage(); System.out.println(re.g

35、etErrorCode(); 扔绸贤浸花脐姑淑镊伸萎都蚁屏款甩弦壳畔餐隔嘻面笑球冲实滞侩缀轧韧开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS客户机的调用规范服务器/客户机提交同步/异步CallProgramAndCommit服务器提交同步CallProgram客户机提交同步CallProgramDSyncAndCommit服务器提交异步CallProgramDSync客户机提交异步客户机调用CallProgram和CallProgramDSync时,最终一定要调用Commit或

36、RollBack,事务是否提交以此为准。但是在此期间,program一直占据application server。如果发生网络故障,须等到超时,才能完成事务回滚,在此期间,可能因数据库记录锁定导致相关存取挂起。络傍哎反沮蒋淌乒苗止滥隙即酚津敌挤嘘写蜘锄凸扩患棵耍酚权蛛褥疫倚开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms从异步调用得到返回值常用函数/方法4GetReply 4GetReplyWait 4GetSpecReply,SetMsgQlf 4GetSpecReplyWait,SetMsg

37、Qlf 示例程序参见EasyCICS手册(2006-7-9)5.2.4。肯颁锥贰爷润砍蝎讼窝望吭碰辩藐拼杭驱酮猜狮有泉巢尊热公腿此锭甘魔开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms关于半个汉字或生僻汉字而引起的Windows解析错误 这种错误的原因是:Windows的在COM/OLE实现中,需要根据字符集进行字符转换。如果字符串中出现半个汉字或生僻汉字,会引发转换错误。在EasyCICS v2.26的COM/OLE实现中增加了GetValueByte和RsGetColByte函数,直接返回字

38、节数组,而不是返回字符串。这样可以避免因插入半个汉字或生僻汉字而引起的Windows解析错误。自己定义的结构(中间插入半个汉字)也没有任何问题。另一种办法是使用EasyCICS v2.26a对Windows动态连接库的支持。其中DllEc.dll用于一般使用,DllEcx.dll增加了一个句柄,可用于多线程的程序。使用DllEc.dll和DllEcx.dll比使用COM/OLE组件速度快一些,用于多线程程序也比较容易。在demo.zip中增加了一个C语言的例子。用在Delphi和PowerBuilder中也很容易,大家可以根据DllEc.h和DllEcx.h自己进行封装。 拿什咀方倍痞诈沥封诫

39、兵噬攫段镭屈癣涎摸霉掺酸又偏秸敌市抛潭幸泪邮开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS Windows动态连接库(DLL) Client 使用EasyCICS Windows动态连接库(DLL)客户机开发程序与使用C/C+开发完全一样。EasyCICS提供了两种动态连接库。其中DllEc.dll用于一般使用,DllEc.dll增加了一个句柄,可用于多线程的程序。使用DllEc.dll和DllEcx.dll比使用COM/OLE组件速度快一些,用于多线程程序也比较容易。在dem

40、o.zip中增加了一个C语言的例子。用在Delphi和PowerBuilder中也很容易,大家可以根据DllEc.h和DllEcx.h自己进行封装。如果在Windows上使用C/C+的话,也可以使用EasyCICS DLL Client。注意使用相应的头文件和输入库。单线程访问ECI的程序可以使用DllEc.h和 DllEc.lib,多线程访问ECI的程序可以使用DllEcx.h和 DllEcx.lib。另外EasyCICS v2.29a还提供了在Borland C+环境中使用的输入库DllEc.lib和DllEcx.lib。少棍鉴挪辅坍裹烹沪叼漏季玫泄尔雅锥布捷腥谤蛔夏藉耍郝钮仔击哩春案开发

41、1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS Java Client - JavaGateway类型 Local Gateway从本地CICS Client直接获取ECI/EPI连接。这种情形相当于使用JNI访问CICS Client。每一个客户机必须安装完整的CICS Client的运行环境,并在CLASSPATH中包括ctgclient.jar文件和ctgserver.jar文件。优点:不用启动Transaction Gateway进程缺点:Client程序必须与CICS C

42、lient装在同一台机器上。示例:App oEc = new easycics.App();oEc.strJGateName = local:;oEc.ConnectServer(CICSNT01, TEST, TEST);Remote Gateway在装有CICS Client的机器上启动Transaction Gateway,Client程序连接此Gateway机器即可。此Gateway进程运行在安装了CICS TG的机器上,其它客户机通过与此安装了Gateway进程的机器通信即可。而这些客户机只需要ctgclient.jar文件并在CLASSPATH中指定即可。在程序中必须提供安装了Ga

43、teway进程的机器使用的IP地址和端口号(缺省是2006)。优点:Client程序无须安装CICS Client,只须ctgclient.jar即可。缺点:必须启动Transaction Gateway进程。示例:App oEc = new easycics.App();oEc.strJGateName = “172.20.60.240”;oEc.iJGatePort = 2006;箍怠苑螺逛研箱墨萤飘滔漾寡灼稿兼榨教估兴期搭肝妥靠罚舔喷贸纹工列开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms

44、复用连接 ConnectAs示例程序参见EasyCICS手册(2006-7-9)6.3.2。 扩擎睛艺含仟劲丸稳斌藕宝馁驻侨敢囤垃浴咐螺呜皇就漫阮罢之毖归筹醉开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS客户程序使用多线程的注意事项 对于使用COM/OLE接口的程序,必须在主线程生成EasyCICS的App对象。在不同的线程使用不同的App对象可以避免互相干扰。对于使用C/C+的程序,如果要在不同的线程调用CICS服务程序,应该使用C+来处理。也就是说,在各自的线程生成各自的E

45、cx对象,以避免重入错误。另一种好办法使用动态连接库DllEcx.dll,在每个线程里使用dllCreateHandleX函数创建CICS连接句柄。 多线程的程序要尽量避免使用全局和静态变量,以及线程不安全的函数(比如strtok等),除非程序员明白其后果。 另外应该在所有线程的ECI调用结束之后再退出程序,否则可能引起客户程序异常。 豫澡融谚糕吏乃围剐亲夏内晒撑鲜黑术史内茵雕瓤胆韶童抛浩灿啪戳潘祖开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS客户程序使用多进程的注意事项 这主

46、要是指C语言的程序,注意以下几点:编译方式要参照示例程序。有时因为没有加上“-lpthread”而造成程序运行时挂住。在父进程做了ECI调用后,再使用fork生成子进程,则子进程不能再做ECI调用。否则会造成应用运行时挂住。 领岗嫌袍慑六纬抡晌绍余竞循痰醚尖语恿尧写洒沼脂卫阎胎新娱龙陷牙惮开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsECI调用的控制 设置设置ECI调用的超时时间调用的超时时间 - SetEciTimeOut 设置transaction分类 SetTransId注:设置交易分类

47、注:设置交易分类: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:ClassMaxTaskLim (缺省:“0,0,0,0,0,0,0,0,0,0”)。 梨缠辑疼松褒晚笺久诀泻友肢吁拱亢项刀拆般药灸锦避失惶值辑矣执轨垦开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms针对Hig

48、h Availability,Load Balance和分布式调用的处理客户机:4CICS Client Work Load Manager4CICS Universal Client User exit4ConnectServer24ServerList函数组(ServerListInit, ServerListAdd, ConnectServerListX) 示例程序参见EasyCICS手册(2006-7-9)7.5.1。服务器:4EasyCICS全局全局SYSID配置规则配置规则任何一个域不许使用缺省的RD/LocalSysId属性(即不能用ISC0)。任何一个域的RD/LocalSys

49、Id属性必须唯一。通向另一个域的CD项名称与该域的RD/LocalSysId属性相同。要求设置TD属性中CPMI和CECI的RSLCheck属性为none。 4CICS Server Work Load Manager嘛淹申潞象端梢械挣洱番茧射孝前股车县喉韶郧咕警辽着饮捏搅磨痒稚僳开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms使用SSL的CTG Java程序例package self;import easycics.*;import com.ibm.ctg.client.*;import co

50、m.ibm.ctg.server.*;public class GetTimestatic public void main( String astrArg ) try App oEc = new easycics.App(); oEc.strJGateName = ssl:/127.0.0.1:8050; SslJavaGateway.setKeyRing(D:/client.jks, 12345678); oEc.ConnectServer(CICSNT01, TEST, TEST); oEc.CallProgramAndCommit(GETTIME); System.out.printl

51、n(oEc.GetValue(TIME); catch(ServerErrorException se) System.out.println(se.getMessage(); System.out.println(se.getErrorCode(); 吁跨拓氟懦嗣壹祖停刷叁肌巨题单君拿综抓咬德茂谚令横塔测熙婆咖游严开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms如何使用C#开发EasyCICSusing System;namespace MyTest class MainApp public

52、static int Main() int r; EcOleImp.AppClass oEc= new EcOleImp.AppClass(); oEc.About(); r = oEc.ConnectServer(CICSNT01, TEST, TEST); if(r!=0) Console.WriteLine(Connect Failed!); return -1; oEc.CallProgramAndCommit(GETTIME); r= oEc.GetErrCode(); if(r!=0) Console.WriteLine(Invocation Failed!); return -2

53、; Console.WriteLine(Current Server Time = + oEc.GetValue(TIME); return 0; 误莲榔胯刀侠渠籍蛀忻贪央组窄蛔炕裂漾魂赞巾蕾揩赊煌半诅控鞭蒂鹿抡开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006庶品锈励卿沦雍顺浪琐吸佑调型碴纺耕峡贪佑避狄泅沮都器锄酸常呆峪异开发1-使用EasyCICS开发1-使用EasyCICSEasyCICS服务器开发秩变形郝气俊

54、么粥啡摹畸拴耻太普幂籽个命宾尸焊蓬迭导丢诣哈旺杀委小开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS服务程序的最简框架 #include easycics.hvoid main()if( InitEasyCics() ) ExitEasyCics();/* 读取客户机提供的信息 */* 调用BeginWrite();设置返还客户机的信息 */ExitEasyCics(); 惠润薪态俞桩莉鲤刽咸蹄碌窥哦蛾党忌咙逐柠探毛问逐隙奋秀沧菲抿挝肢开发1-使用EasyCICS开发1-使用Ea

55、syCICSIBM Software Group TXSeries for MultiplatformsEasyCICS服务程序提供以下函数用于程序间调用 同步/异步启动新UOW(事务)使用sysid覆盖原进程CallProgram同步是(对不同的region)否否CallProgramSys同步是(对不同的region)是否CallProgramXCTL同步否否是StartTran异步是否否StartTranSys异步是是否CallProgramExt同步否否否CallProgramSysExt同步否是否绕权软咀燎堰臭账叙乌翻织漂踊政刀祈远芒票膜纂骇酱匿好缩油浪奶诈缮开发1-使用EasyCI

56、CS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsTXseries服务程序互相调用时的事务边界情况 如果是两个不同的CICS域的CICS服务程序相互调用,比如PrgA调用PrgB: 4如果在两阶段提交的情况下,也就是说采用两阶段提交的XA Switch Load File;采用支持两阶段提交的连接方式,比如PPC TCP和PPC Gateway;且采用无SYNCONRETURN的调用,比如CallProgramExt,则完全由PrgA决定提交和回滚,PrgB的提交和回滚操作将无效。4如果在一阶段提交的情况下,也就是说采用

57、一阶段提交的XA Switch Load File;采用只支持一阶段提交的连接方式,比如CICS TCP和Local SNA;或采用有SYNCONRETURN的调用,比如CallProgram,PrgA和PrgB自行决定提交和回滚。 如果是在同一个CICS域的CICS服务程序相互调用,比如PrgA调用PrgB,且没有使用SysID,则当前的同步操作将完成从上一个同步操作到目前的所有支持事务的语句。服务程序调用服务程序要注意事项如下:如果有必要,请使用SetCurrentCA来切换通信区。任何结果集的操作不能交叉进行,必要时请使用数组变量。服务程序调用服务程序,客户方的结果集长度不得超过32K,

58、服务器方可以传递超过32K的数据。且不支持上载和下载数据块。必要时可以利用TSQ等传递数据。痕澈走朱回钞淡游朽未完培陨肖毛谷空戚拽疙翁畅湘交疲晒缴宋踩街憎急开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms主控程序#include easycics.hvoid main() char funcs20; int func; if( InitEasyCics() ) ExitEasyCics(); GetValue1( “Func”, funcs, sizeof(funcs) ); func= ato

59、i(funcs); switch(func) case 1: CallProgram(PROG1); break; case 2 CallProgram(PROG2); break; default: PrintStatus( “Error Func” );ExitEasyCics();洁巫品逆满粱怂冶逞峦慢锄舀浦剔责饿同足炭啮夏着羡疟屡溜堂庆涛戍办开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms切换公共数据区 #include easycics.hchar Ca1BUF_SIZE=;void

60、main()int r;char s100; if( InitEasyCics() ) ExitEasyCics(); SetCurrentCA(Ca1); BeginWrite(); RsCreate(1); RsAddRow(); RsSetCol( 1, r1 ); RsSaveRow(); RsAddRow(); RsSetCol( 1, r2 ); RsSaveRow(); r= CallProgram( EC05 ); if(r) CicsAbend( CALL ); GetValue( TIME5, s ); SetCurrentCA(0); BeginWrite(); SetV

61、alue( TIME5, s ); ExitEasyCics(); 辟措嚏妨席赵蜂痔机霸芬靠纺撇倍勺誉侥箕噪赚羌盈否迅蜂蕴尚鸽强贰贾开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS服务程序调用CICS API如果需要返回值RESP,请保证在此C源文件实现调用过:EXEC CICS ADDRESS EIB (dfheiptr);社救偷脂拐查印廖慌辈缓缘铀泊租韧疼授小碎羚帖姓卵攘韶佬矫旬偶电笛开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group

62、 TXSeries for MultiplatformsEasyCICS服务程序高级调用 延时函数 - CicsSleep 加锁 4CicsLockId4CicsUnLockId 4CicsLockIdTest 分配内存空间4CicsMallocLocal 4CicsMallocShared 4CicsFree 存取CWA 4SaveToCwa 4LoadFromCwa 获取唯一ID 4GetUniqueNum, 32位整数位整数4GetUniqueId, 8字节字符串(由0-9,A-F组成)4GetUniqueId6, 6字节字符串(由ASC64- ASC127的字符组成)冬么命灌饿矗马杜祈

63、母盅应载怎抬礼并井肄吭蚁峭嗅布隶枣巍陷股剪擦知开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms 2006 IBM CorporationVersion 112-May-2006庶品锈励卿沦雍顺浪琐吸佑调型碴纺耕峡贪佑避狄泅沮都器锄酸常呆峪异开发1-使用EasyCICS开发1-使用EasyCICSEasyCICS高级特性和注意事项去月毡嘘侩骤调卵敏栈触奴犀题汞芜炮配宜终垦该戚钨舅女逞分捻旗矛哦开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeri

64、es for Multiplatforms由多个二维表格组成的结果集 由多个二维子表格组成的结果集称复合结果集,创建复合结果集的方法是在创建结果集后分别创建每一个二维子表格。在RsCreate函数后使用RsNewTable函数可以创建一个子表格。 读取复合结果集的方法是首先获取各结果集的行数和列数,再分别读取。以下示例显示了连续读取一个由两个子表格组成的复合结果集的方法。 示例程序参见EasyCICS手册(2006-7-9)5.1.5。凹秆垮圣彰载驯飘惊茧邵牵聋弗盈彻贮焦练篙型镐蓉汤喝聊需桥坛成内蛾开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group T

65、XSeries for Multiplatforms下载大数据块注意服务器提供了SaveBlock函数,而客户机提供了GetBlockSize和LoadBlock函数。程序调用的顺序应该是:关键字,结果集,大数据块。示例程序参见EasyCICS手册(2006-7-9)7.2.1。茬扶帅梢竭蹭匝乏补拱遇贾宁恳翼搂恬甲汰兆黎唇敦咐决谍频森鳞酷爽梢开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms上载数据块 注意上载数据块的同时不能再上载结果集 示例程序参见EasyCICS手册(2006-7-9)7.2

66、.2。俘哎汾均嫁同稀厉韦尔讼奈共旦凸蛹促幢潜垫瞥术眯缴竿赞轴砚糜小潞乏开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms上载大结果集 如果采用v2.20以上的版本的EasyCICS,可以上载大于32K的结果集到服务器。但应该在设置Client数据之前先使用SetProperty函数设置目的服务程序。 示例程序参见EasyCICS手册(2006-7-9)7.3。嗡俺臃劫由牢掩颁雁庸蕉饺稳衰江夯鬃担茂披稻我郝殷弄疯岿逃簇镣萍虹开发1-使用EasyCICS开发1-使用EasyCICSIBM Softwa

67、re Group TXSeries for Multiplatforms预防C/C+语言的越界错误 在C/C+语言中,预先分配的数组或者缓冲区可能被过长的输入值所涨破,这叫做越界错误。越界错误很难发现,而且可能随即性地发作,造成系统的各种离奇的故障。EasyCICS中的GetValue和RsGetCol函数都是越界错误容易发生的地方。推荐使用EasyCICS提供的GetValue1和RsGetCol1函数,由于增加了一个表示长度的入参,有效地防止了越界错误的发生。 墓炙立孽利刻陨沟嫩逻掂肠瑰允叫靡盼终疼胰泞检瓤天珐臼咏诸饿搞厂砌开发1-使用EasyCICS开发1-使用EasyCICSIBM S

68、oftware Group TXSeries for MultiplatformsEasyCICS一些命名给用户造成的困扰 有不少EasyCICS的新用户对EasyCICS的一些函数,比如ConnectServer和CallProgramAndCommit提出了困惑的一些问题。所以我感觉需要在这里尽量解释一下:早在1999年EasyCICS就有了完备的实现,其发展过程必然要考虑历史的原因。实际上1999年EasyCICS v1.0的代码还是可以与现在的EasyCICS兼容的,所以在命名上就有一些造成用户不太好理解的地方,也很难去修改。第一个容易造成混淆的地方是ConnectServer函数。实

69、际上,除了使用Java Gateway,一台客户机上无论跑多少个CICS客户程序,只需要建立一个CICS连接,这个连接可以通过命令行cicscli /s=.来建立,如果没有启动客户机,在第一次调用ConnectServer函数时,会建立连接。注意CICS是长连接,一旦启动这个服务器连接,除非使用cicscli -i命令,或者关闭客户机操作系统,否则这个连接永远存在。无论您调用多少次ConnectServer函数,只会有一个连接。这个连接也没有什么句柄之类的东西返回给您,也没有资源损失。ConnectServer函数主要的作用是设置服务器的别名、用户名、口令,并返回一个客户机认为的服务器的启动状

70、态。如果服务器连接是启动的,而且CICS服务器是活动的,就返回0(在EasyCICS,返回0总是成功的意思);如果服务器连接是启动的,而且CICS服务器是不活动的(也可能是网络断了),就返回-1;如果还从来没有启动过服务器连接,就在此时启动服务器连接,并返回1(当然下一次会返回0或者-1)。注意,如果CICS服务器中断后又重新启动,或者网络中断后又恢复,客户机的CICS服务器连接会在一分钟之内恢复。这时,调用ConnectServer函数会从返回-1,改变为返回0。注意ConnectServer函数不会加快这一分钟的恢复时间。如果您觉得客户机不应该如此迟钝,可以使用cicscli /i,再使用

71、cicscli /s=.命令恢复状态。另一个容易引起混淆的函数是CallProgramAndCommit。CallProgramAndCommit会把提交和回滚的权利完全交付给服务器。一些用户使用了CallProgram函数,这个函数要求在客户机端一定要调用Commit或Rollback函数,否则服务器端会一直等待。一些新手使用了CallProgram函数,又不在客户机端调用Commit或Rollback函数,造成了服务器端的cicsas进程被占满了,而且还会造成数据库死锁。推荐尽量使用CallProgramAndCommit,因为它的效率比较高。注意服务器端没有CallProgramAndC

72、ommit函数,有CallProgram函数和CallProgramExt函数。服务器端CallProgram函数要求各自提交,而CallProgramExt函数把提交的权利留给主调方。这一点与客户机很容易混淆。这也是历史原因造成的。 抿丈锣聂韦淡净刘矮焊丹啥女快喇教虑艰考窖峭损额卖驴听薪鲜搞咏烩蜜开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for Multiplatforms有关EasyCICS的TSQ问题 相关概念4RsClose 4RD:TSQAgeLimit4ECTSQ 4文件缓冲方式(参见EasyCICS手册(200

73、6-7-9)8.3.3) 参见EasyCICS手册(2006-7-9)8.1。踢所轴匿五蔬倦层诵建亮莎婶培郡刽抓敌狄针旋辅色成什申厩仿耙绩碉藉开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS v2.28使用文件系统作为缓存的设置步骤示例1.创建供EasyCICS使用的缓存文件系统mkdir /var/cicstmpchown -R cics:cics /var/cicstmp2.在Region的environment文件中加入:(如果不加入此项,则还是使用TSQ)ECB_DIR=

74、/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 PathName=. RSLKey=public唁椅伎镶顿雍冒焚隔朗灸皂权池孰忿摹极喳您育兴形榔戈隐才此啸曳勾迸开发1-使用EasyCICS

75、开发1-使用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/ramdisk0 /var/cicstmpchown -R cics:cics /var/cicstmp#注:如果要删除该RAMDis

76、krmramdisk 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的全局配置规则配置CD等2) 定义ECB程序make -f ecb.unix.mkcicsadd -c pd -r . ECB Pa

77、thName=. RSLKey=public蓝拖学斯就婆铺赚梳矿粘黔域简澈锑帐必亡漂促蓉焰粤插圃询恋少赛雾丢开发1-使用EasyCICS开发1-使用EasyCICSIBM Software Group TXSeries for MultiplatformsEasyCICS应用程序的调试方法 使用应用日志使用应用日志对于EasyCICS的服务程序,可以使用PrintStatus和CicsAbend函数把应用信息输出到文件并打印到控制台,此时输出的文件是CSMT.out。另一种常用的函数是fprintf,把调试信息以行(n)为单位打印到stderr,此时输出的文件是console.# (注意在Wi

78、ndows平台需要调用fflush才能及时输出)。察看察看CICS通信区通信区可以通过SetValue/GetValue传递调试信息。还可以使用空字符串(“”)作为Key值,此时调用GetValue就取得整个公共数据区的内容,观察内容是否恰当。 使用使用CECI调试调试如果熟悉URL的编码方案,可以直接用CECI进行调试。例如:调用标准的示例程序TELECOM的公共数据区可以写成:“NO=2020088&”,相当于使用了“SetValue(“NO”, “2020088”);”。 瞄式稍漂朴核嫡难歇背浪闹谊泌格牲饰球灵溪赏革垫固半亥鞋激邯榴产珍开发1-使用EasyCICS开发1-使用EasyCICS

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

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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