Web service 与 CICS 事务处理应用的集成.docx

上传人:b****6 文档编号:7953244 上传时间:2023-01-27 格式:DOCX 页数:23 大小:391.02KB
下载 相关 举报
Web service 与 CICS 事务处理应用的集成.docx_第1页
第1页 / 共23页
Web service 与 CICS 事务处理应用的集成.docx_第2页
第2页 / 共23页
Web service 与 CICS 事务处理应用的集成.docx_第3页
第3页 / 共23页
Web service 与 CICS 事务处理应用的集成.docx_第4页
第4页 / 共23页
Web service 与 CICS 事务处理应用的集成.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

Web service 与 CICS 事务处理应用的集成.docx

《Web service 与 CICS 事务处理应用的集成.docx》由会员分享,可在线阅读,更多相关《Web service 与 CICS 事务处理应用的集成.docx(23页珍藏版)》请在冰豆网上搜索。

Web service 与 CICS 事务处理应用的集成.docx

Webservice与CICS事务处理应用的集成

Webservice与CICS事务处理应用的集成

2008年12月11日

CICS(CustomerInformationControlSystem),即客户信息控制系统,是为IBM和非IBM平台上一系列应用提供联机事务处理和事务管理的产品,其主要功能是为商业应用提供一个事务处理环境。

该产品拥有近四十年的悠久历史,被广泛应用于银行金融业。

但随着当前信息技术的迅猛发展,很多经典的事务处理应用面临着如何被扩展和重用,以求与其他平台应用相集成的问题。

CICS作为IBM的重要产品,借鉴了SOA的主要思想,采用Webservice封装已有的应用,实现了CICS与其他平台应用的结合与互操作。

本文通过一个实际的例子,将一个已有的CICS应用程序封装成Webservice的请求者(requester)请求另一个Webservice,同时又作为服务提供者(provider)接受其它应用的访问。

读者不仅能从本文详细了解到如何在z/OS上构建CICSWebservice的详细步骤,同时能够把握CICSWebservice如何与部署在其他平台上的Webservice进行互操作,以及与IBMWSRR(WebSphereServiceRegistryandRepository)的结合使用。

概述

主机(Mainframe)上的CICS服务由于其历史的悠久,存在着很多对于事务处理的经典应用。

如何将这些应用重用,并与其他平台的服务进行交互是本文的主要内容。

本文模拟了一个非常普遍的应用场景,通过实例介绍CICSWebservice的封装和具体应用。

该实例的总体框架如图1所示,主要包括三部分。

1.实时汇率服务(ExchangeRateService,下文简称为RateService),是部署在Windows操作系统WebsphereApplicationServer(WAS)上的一个Webservice,提供汇率值的实时查询服务,由Java语言实现。

为了使例子简单易懂,这里仅仅提供了人民币对美元的汇率和人民币对欧元的汇率。

2.转账服务(TransferService),一个存在于主机z/OS环境中的CICS事务处理应用程序,它是由C语言编写,用于银行帐户不同币种的转账处理。

例如某银行客户张三,上月去美国透支了信用卡中1000美元用于消费,现在回到中国必须用人民币转账到自己的信用卡美元账户以偿还透支额度。

转账过程中必须知道人民币对美元的汇率,因此需要封装成为Webservice的客户端(requester)访问RateService提供的实时汇率服务。

同时,为了使转账服务能够提供给异构平台上各种语言的客户端调用,还需要将其封装成Webservice的提供者(provider)。

3.网上银行(OnlineTradingPlatform),模拟的网上交易平台。

客户端调用转账服务(TransferService)完成客户用人民币偿还信用卡美元帐户等类似转账交易。

作者在本文中给出了一个Struts框架实现的Web应用程序来模拟这一交易平台。

图1.实例总体框架

第一步:

汇率服务的创建

1.开发环境

开发平台:

Windows操作系统,IBMRationalApplicationDeveloper7.0.0(内置WebsphereApplicationServer6.1)

开发语言:

Java

2.开发步骤

新建一个动态web项目。

在IBMRAD7开发环境中,选择"File->New->Project",选择动态web项目,命名为exchange,保留其它选项默认值。

编写要暴露成Webservice的Javabean。

右键点击JavaResources:

src目录,选择"New->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;

if(target.equalsIgnoreCase("Euro"))

returnRMBtoEuro;

}

//anyinputerror,return0

return0;

}

}

将JavaBean封装成Webservice。

右键点击项目名称exchange,选择"New->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是否工作正常。

首先在"...\exchange\WebContent\WEB-INF\wsdl"目录下找到Rate.wsdl文件,右键单击该文件选择"WebServices->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

第二步:

转账服务的实现

1.开发环境

开发平台:

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源代码

*****************************TopofData******************************

//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****************************

∙Dataset"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?

?

(255?

?

);

}getRate;

};

RATEI01则存储的是经过RateService处理请求之后返回给TransferService的数据结构,源码如下:

清单5.RATEI01源代码

structratestr01

{

struct

{

chargetRateReturn?

?

(32?

?

);

}getRateResponse;

};

在产生了上述的wsbind文件和相应的输入输出数据结构之后,便可以开始TransferService代码的编写。

TransferService作为Webservice的服务端(provider)也必须定义输入和输出数据结构两个member文件,分别为TRANSI和TRANSO。

TRANSI中的输入结构必须命名为CMDINPUT,TRANSO中的输出结构则必须命名为OUTPUT。

根据上文提到的逻辑,输入结构(CMDINPUT)中应该有四个值:

用户名,转账金额,源账户和目标账户,如清单6所示。

输出结构(OUTPUT)中定义账户转账之前和之后的金额两个值,如清单7所示。

清单6.TRANSI中CMDINPUT结构体的定义:

structCMDINPUT

{

charuser?

?

(32?

?

);

charsum?

?

(255?

?

);

charsource?

?

(255?

?

);

chartarget?

?

(255?

?

);

};

清单7.TRANSO中OUTPUT结构体的定义:

structOUTPUT

{

charbefore?

?

(255?

?

);

charafter?

?

(255?

?

);

};

完成上述准备工作,焦点转移到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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 机械仪表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1