Web service 与 CICS 事务处理应用的集成Word格式.docx
《Web service 与 CICS 事务处理应用的集成Word格式.docx》由会员分享,可在线阅读,更多相关《Web service 与 CICS 事务处理应用的集成Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
开发语言:
Java
2.开发步骤
新建一个动态web项目。
在IBMRAD7开发环境中,选择"
File->
New->
Project"
选择动态web项目,命名为exchange,保留其它选项默认值。
编写要暴露成Webservice的Javabean。
右键点击JavaResources:
src目录,选择"
Class"
,填写包名rate、类名Rate。
Javabean源代码如清单1所示,提供了人民币对美元和人民币对欧元的汇率。
清单1.JavaBean源代码
packagerate;
publicclassRate{
doubleRMBtoDollar=0.1426;
doubleRMBtoEuro=0.09026;
StringerrorMsg="
Inputisnotcorrect"
;
publicdoublegetRate(Stringsource,Stringtarget){
if(source.equalsIgnoreCase("
RMB"
)){
if(target.equalsIgnoreCase("
Dollar"
))
returnRMBtoDollar;
Euro"
returnRMBtoEuro;
}
//anyinputerror,return0
return0;
}
}
将JavaBean封装成Webservice。
右键点击项目名称exchange,选择"
Other->
WebServices->
WebService"
。
设置Webservice的构建方式,选择"
BottomUpJavaBeanWebService"
——自底向上(由JavaBean生成WSDL文件)的构建方式。
同时指定Rate类作为该JavaBean,如图2所示。
点击"
Finish"
,一个Webservice便构建成功。
在"
...\exchange\WebContent\WEB-INF\wsdl"
目录下可以找到刚刚生成的Rate.wsdl文件。
wsdl文件描述了该服务的相关信息,该文件可从附件中下载查看。
图2.设置Webservice构建方式
部署Webservice到应用服务器。
启动应用服务器(这里是WebsphereApplicationServer6.1),加载该动态项目的EAR包exchangeEAR。
3.测试Webservice
利用内嵌在RationalApplicationDeveloper开发环境中的Webservice客户端工具(WebServicesExplorer)测试RateService是否工作正常。
首先在"
目录下找到Rate.wsdl文件,右键单击该文件选择"
TestwithWebServicesExplorer"
,打开客户端测试窗口。
WebServicesExplorer"
窗口左侧找到Rate.wsdl文件,选中该WebService提供的操作(Operation)——"
getRate"
,窗口右侧出现该服务的详细描述并提供输入界面并显示输出结果。
在source项中输入RMB,在target项中输入DOLLAR,得到人民币对美元的汇率0.1426。
这说明RateService运行正常,如图3所示。
图3.使用WebServicesExplorer测试Webservice
4.发布RateService到WSRR(WebSphereServiceRegistryandRepository)。
最后需要将描述RateService的wsdl文件(Rate.wsdl)上传到WSRR->
WSDL管理中心,由WSRR统一管理,方便用户查找该服务,如图4所示。
CICS在3.2版本之后于2008年上半年发布了支持WSRR的工具包,将在下文详细介绍。
图4.WSRR发布RateService
第二步:
转账服务的实现
CICS3.2onz/OS,DB2v8onz/OS
C语言
2.CICSWebservice相关概念。
CICS对Webservice的支持主要通过以下几方面来实现:
CICS支持Webservice的相关资源,主要有PIPELINE、URIMAP、WEBSERVICE、TCPIPSERVICE等,这些资源能够定义WebService的处理过程。
WebServicesAssistant工具,最新的CICS3.2工具包主要由两个程序组成:
DFHWS2LS和DFHLS2WS。
它们在3.1的版本上有所增强,提供了更丰富的支持,可支持的语言包括:
COBOL、PL/I、C、C++。
用户可以通过使用WebServicesAssistant来快速方便地实现WebService,也可以通过自己编程完全地控制CICS程序和WebService接口之间的数据交互。
∙DFHWS2LS:
帮助用户把WSDL文件中的数据定义映射为CICS程序所使用编程语言的数据结构。
∙DFHLS2WS:
帮助用户把高级语言编写的CICS程序所使用的数据结构转换成WSDL定义。
支持WebService的CICSAPI,例如INQUIREWEBSERVICE,INVOKEWEBSERVICE等。
此外CICS在推出3.2版之后又发布了一个独立的工具包CICSSupportPacforWSRR,支持CICSWebservice与WSRR的结合使用。
这个工具包主要包含两个程序:
DFHWS2SR和DFHSR2WS。
∙DFHWS2SR:
帮助用户来把已有的wsdl文件从主机USS系统中发布到WSRR。
∙DFHSR2WS:
用来帮助用户把发布在WSRR上的wsdl文件下载到主机USS系统中。
3.背景分析
转账服务(TransferService,下文中两者通用)通常是部署在CICS上的一个应用程序,它负责完成各种货币之间的兑换和帐户的转账交易,这是CICS应用程序在银行业务中最常见的一种应用。
在没有引入Webservice以前,转账服务必须将有关汇率的处理包含在程序逻辑之内,增加了程序的耦合性。
最好的情况也只能封装成CICS区域(region)上的不同应用程序,通过CICS提供的程序之间或区域之间通信的API来互相调用。
这样一来汇率服务就很难与其他平台和语言编写的程序实现互操作。
而Webservice的引入有效的解决了上述问题,充分实现了服务的可重用性和互操作性。
转账服务的详细处理逻辑:
转账服务首先作为Webservice的服务端(provider),等待客户端的参数输入。
输入包括四个参数:
用户名、转账金额、源账户、目标账户。
例如:
Zhanglin,100,rmb,dollar四个参数表示从zhanglin的人民币账户中转出100元人民币到他的美元账户。
转账过程中,需要用到人民币与美元之间的汇率。
此时,转账服务转变角色,作为Webservice的客户端(requester)调用RateService提供的汇率服务。
4.开发步骤
下面通过Webservice封装转账服务的详细步骤,向读者展示CICSWebservice的应用,并结合实际应用阐述以上有关CICSWebservice相关的理论和概念。
转账服务作为RateService的客户端(requester),需要知道RateService相关描述,所以必须首先通过DFHSR2WS从WSRR上下载描述RateService的Rate.wsdl文件。
在主机上通过提交一个JCL,指定相关参数,便可以调用DFHSR2WS程序,将Rate.wsdl文件下载到USS系统文件夹下。
JCL源码如清单2所示:
清单2.调用DFHSR2WS下载Rate.wsdl文件的JCL源代码
*****************************TopofData******************************
//DSR2WSRTJOBMSGCLASS=H,CLASS=A,NOTIFY=&
SYSUID,REGION=0M
//*********************************************************************
//**
//*DESC:
retrievethewsdlfilefromWSRR*
//WSDLREADJCLLIBORDER=LIUGUAN.CA1N.JCL
//EXECEXECDFHSR2WS,
//JAVADIR='
java142s/J1.4'
//WORKDIR='
/u/liuguan/install'
//TMPDIR='
/tmp'
//TMPFILE='
SR2WS'
//INPUT.SYSUT1DD*
HOSTPORT=:
9080
LOCATION=/u/liuguan/userdemo/wsdl/
LOGFILE=/u/liuguan/userdemo/wsdl/wsdlrate.log
NAME=Rate.wsdl
*/
****************************BottomofData****************************
∙Dataset"
LIUGUAN.CA1N.JCL"
指定了执行DFHSR2WS程序所需要的相关资源
∙HOSTPORT指定WSRR部署的服务器和端口。
∙LOCATION指定wsdl文件存放在USS下的具体位置。
∙LOGFILE指定日志文件,记录程序执行成功或失败的相关信息。
∙NAME指明在WSRR上要下载的wsdl文件名。
上述参数是执行DFHSR2WS所必须的,其他参数及有关于DFHSR2WS更详细的介绍可以在工具包的帮助文档中查到。
Rate.wsdl文件成功下载后,即可以通过CICS3.2工具包中的DFHWS2LS程序,将wsdl文件中描述的输入输出转换成具体语言的数据结构,提供给转账服务程序使用。
调用DFHWS2LS仍然通过提交一个JCL,成功执行后会有两个member产生,一个描述服务的输入,另一个描述输出。
JCL的源码如清单3所示:
清单3.调用DFHWS2LS实现XML到data转换的JCL源代码
//TWS2LSJOB616,LGJ,MSGLEVEL=(1,1),REGION=0M,NOTIFY=&
SYSUID
//*JUSTIN
//*THISJCLCONVERTWSDL(GETFROMPROVIDER)TOLANGUAGESTRUCTURE
//*ANDWSBINDFILE
//*THISISASAMPLEOFWSCELL
//MYPROCJCLLIBORDER='
CTS320.CICS650.SDFHINST'
//JAVAPROGEXECDFHWS2LS,PATHPREF='
'
USSDIR='
cerbsf'
//STEPLIBDDDSN=CTS320.CICS650.SDFHINST,DISP=SHR
//DDDSN=CNTESTD.CICS.C.SRC,DISP=SHR
//INPUT.SYSUT1DD*
LOGFILE=/u/liuguan/userdemo/ws2ls/rate.log
PDSLIB=//LIUGUAN.ACICS.WSAT.SOURCE
REQMEM=RATEO
RESPMEM=RATEI
LANG=C
STRUCTURE=(ratestq,ratestr)
WSBIND=/u/liuguan/userdemo/wsclient/wsbind/rateask.wsbind
WSDL=/u/liuguan/userdemo/wsdl/Rate.wsdl
/*
//
****************************BottomofData****************************
CTS320.CICS650.SDFHINST"
指定了执行DFHWS2LS程序所需要的相关资源。
∙PDSLIB指定输入输出两个member产生的位置。
∙REQMEM指定转换输入的数据结构。
∙RESPMEM指定转换输出的数据结构。
∙LANG指定要转换为哪种语言的数据结构。
∙WSBIND指定转账服务在作为Webservice客户端所需要的相关配置信息,它将会在PIPELINE安装时用到。
通过wsbind文件,真正的语言结构(LanguageStructure)和SOAP包中xml对于数据结构的定义才能相互对应并转换。
∙WSDL则指定要生成LanguageStructure的wsdl文件。
JCL执行成功后,会在Dataset"
LIUGUAN.ACICS.WSAT.SOURCE"
生成两个member,RATEO01和RATEI01(末尾加上01是DFHWS2LS的命名规则)。
RATEO01中存储的是TransferService作为RateService客户端请求RateService时发出的数据结构,源码如清单4所示(主机中因为编码的原因?
?
(代表[,而?
)代表],下同):
清单4.RATEO01源代码
structratestq01
{
struct
charsource?
(255?
);
chartarget?
}getRate;
};
RATEI01则存储的是经过RateService处理请求之后返回给TransferService的数据结构,源码如下:
清单5.RATEI01源代码
structratestr01
chargetRateReturn?
(32?
}getRateResponse;
在产生了上述的wsbind文件和相应的输入输出数据结构之后,便可以开始TransferService代码的编写。
TransferService作为Webservice的服务端(provider)也必须定义输入和输出数据结构两个member文件,分别为TRANSI和TRANSO。
TRANSI中的输入结构必须命名为CMDINPUT,TRANSO中的输出结构则必须命名为OUTPUT。
根据上文提到的逻辑,输入结构(CMDINPUT)中应该有四个值:
用户名,转账金额,源账户和目标账户,如清单6所示。
输出结构(OUTPUT)中定义账户转账之前和之后的金额两个值,如清单7所示。
清单6.TRANSI中CMDINPUT结构体的定义:
structCMDINPUT
charuser?
charsum?
};
清单7.TRANSO中OUTPUT结构体的定义:
structOUTPUT
charbefore?
charafter?
完成上述准备工作,焦点转移到TransferService程序的逻辑编写,该程序命名为TRANSFER。
TRANSFER程序中几段核心的源码介绍如下。
清单8.CICSDB2应用接口的声明:
EXECSQLBEGINDECLARESECTION;
chardbuser?
(11?
doublemoney=0;
doublermb_account=0;
doubletarget_account=0;
EXECSQLDECLARELIUGUAN.USERDEMOTABLE(
USER_NAMECHAR(10)NOTNULL,
RMB_ACCOUNTDOUBLE,
DOLLAR_ACCOUNTDOUBLE,
POUND_ACCOUNTDOUBLE,
EURO_ACCOUNTDOUBLE,
JPY_ACCOUNTDOUBLE,
HKD_ACCOUNTDOUBLE,
TWD_ACCOUNTDOUBLE,
KRW_ACCOUNTDOUBLE
);
EXECSQLENDDECLARESECTION;
清单8中,"
EXECSQLBEGINDECLARESECTION"
和"
EXECSQLENDDECLARESECTION"
之间声明了程序将会连接的数据库表和相关变量,这是CICS操作DB2的用法,必须在main函数前首先声明。
从这个DECLARESECTION中可以看到程序将会操作数据库名为LIUGUAN下的USERDEMO表。
该表的结构如SECTION所示,已在主机DB2中建好。
完成相关的声明,在函数内部才能使用CICS操作DB2的API。
清单9.CICSWebserviceAPI的应用:
//*putdatainthecontainerandsendtherequesttogetratevalue
EXECCICSPUTCONTAINER(name_container)
CHANNEL(channel_name)
FLENGTH(sizeof(rateout.getRate))
FROM(rateout.getRate);
//*invokethe