dev2dev 首页 > 资源中心 > 技术文章
将BEA AquaLogic Service Bus与i5/OS和OS/400应用程序连接起来
BEA AquaLogic Service Bus (ALSB)在企业系统中提供消息路由和转换功能。通过ALSB,企业可以使用基于配置的声明式方法将其i5/OS (OS/400)资产集成到面向服务的架构中。ifiveos transport使得ALSB和i5/OS程序之间的直接集成成为可能,而不需任何中间应用服务器或额外的编码。
背景
由于多家供应商提供了多种适配器,所以传统上就可能实现i5/OS (OS/400)资产与其他系统和Web的集成。这些适配器用于围绕i5/OS程序开发服务包装器。服务包装器、Web服务或EJB依次通过Enterprise Service Bus公开给客户端。该架构如图1所示。

图 1. 包装器将资产公开为Web服务
该架构的典型实现利用IBM Toolbox for Java作为库对i5/OS程序进行远程调用。开发人员创建的Java包装器(EJB或Web服务)部署在BEA WebLogic Server或另一台应用服务器上。该应用服务器可能运行在不同的硬件上:ALSB硬件甚至i5/OS (IBM WebSphere)。
在图1中,程序是使用绿框表示的,基于配置的组件则使用蓝框表示。
该图有什么不当之处?
它并不完美。观察应用服务器框,我们可以称之为“服务支持”层。这些程序包装器本身就是需要开发的程序。可以手动编码,也可以通过向导生成,但最终它们都是需要维护的程序。包装程序中的任何变化都要求支持层更改代码。
包装程序也是部署到运行时环境,这使该方法的总成本中添加了运作成本。
就性能而言,ALSB和i5/OS程序之间又存在一层,这提高了响应时间,并且可能限制可伸缩性。
更好的方法
理想的情况是去掉服务支持层,使ALSB直接连接到i5/OS程序。该方法可提供:
- 更好的适应性,因为ALSB和i5/OS之间的连接是在ALSB中配置的,并非编码在包装程序中。
- 更低的运作成本,这是通过去掉整整一层实现的。
- 更好的性能和可伸缩性,这是通过减少客户端和服务之间的跃点实现的。
图2是改良架构的示意图。

图 2. 去掉服务支持层
有一个ALSB扩展正好支持该架构:直接连接到i5/OS程序。该扩展就是ifiveos transport。从ALSB调用i5/OS程序很简单:
- 配置业务服务,指定i5/OS服务器的主机名或IP地址和登录信息。这是在设计时实现的。
- 调用业务服务,以i5/OS程序的名义传递XPCML文档来调用输入参数。来自该程序的响应将作为另一个带有返回值的XPCML文档返回。这是在运行时实现的。
下面讲述一些细节。
XPCML
XPCML是 Extensible Program Call Markup Language,是IBM定义的XML语言。XPCML文档包含调用i5/OS程序、传递参数和接收结果所必需的信息。下面是XPCML文档中调用“检索用户信息”程序(QSYRUSRI)的代码片断:
<program name="program" path="/QSYS.lib/QSYRUSRI.pgm">
<parameterList>
<structParm name="receiver" passDirection="out" struct="usri0100"/>
<intParm name="receiverLength" type="int" length="4" usage="input"
init="128"/>
<stringParm name="format" passDirection="in" length="8">
USRI0100
</stringParm>
<stringParm name="profileName" passDirection="in" length="10">
*CURRENT
</stringParm>
<intParm name="errorCode" passDirection="in">0</intParm>
</parameterList>
</program>
该文档包括该程序名称和参数列表。参数可以是简单类型,也可以是同一文档中定义的复杂结构。
IBM提供了通过Toolbox for Java使用XPCML调用i5/OS程序的机制。ALSB和ifiveos transport利用这项技术对i5/OS程序执行直接调用。XPCML的声明式本质与ALSB以及XQuery的消息处理机制完美地集成到一起。
在代理服务内,需要使用i5/OS程序的输入参数创建和填充XPCML消息。程序名称是在program元素的path属性中指定的。必须将program元素的name属性设置为值program,如以下所示:
<program name="program" path="/QSYS.lib/QSYRUSRI.pgm">
一旦以XPCML文档的方式收到来自业务服务的响应,代理服务就可以使用XQuery提取相应的信息。代理会将该XPCML文档转换成代理接口中定义的格式,如图3所示。

图 3. 代理服务和业务服务之间的XPCML文档交换
示例
选择一个i5/OS系统程序(“列出工作信息”QWCRSSTS),以演示如何直接从ALSB执行程序调用。为了简便起见,我们将创建不接受任何参数的代理服务,调用i5/OS业务服务,提取系统名称,然后将其返回给调用方。
还将假设已经安装并配置了ifiveos transport,并且业务服务已经配置为连接到i5/OS服务器。请参阅本文末尾的CodeShare链接,以获得详细指导。在指导中,您会发现i5/OS业务服务的一个参数是i5/OS主机的主机名或IP地址,如图4所示:

图 4. 业务服务的简单传输配置
代理服务的消息流只包含一个到i5/OS业务服务的路由节点,如图5所示。

图 5. 代理服务的消息流
该路由节点只是对i5/OS业务服务的调用,如图6所示。

图 6. 到i5/OS业务服务的路由
将调用路由到业务服务之前,我们将body变量更改为包括XPCML消息,该消息包含i5/OS程序调用描述。下面列出传递给业务服务的新body:
<soap-env:Body>
<xpcml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="xpcml.xsd" version="4.0">
<struct name="SSTS0100">
<intParm name="bytesAvailable" passDirection="out"/>
<intParm name="bytesReturned" passDirection="out"/>
<stringParm name="currentDateTime" passDirection="out" length="8"/>
<stringParm name="systemName" passDirection="out" length="8"/>
<intParm name="usersCurrentlySignedOn" passDirection="out"/>
<intParm name="usersTempSignedOff" passDirection="out"/>
<intParm name="usersSuspendedBySystem" passDirection="out"/>
<intParm name="usersSuspendedByGroupJobs" passDirection="out"/>
<intParm name="usersSignedOffWithPrtOutWait" passDirection="out"/>
<intParm name="batchJobsWaitingForMessages" passDirection="out"/>
<intParm name="batchJobsRunning" passDirection="out"/>
<intParm name="batchJobsHeldWhileRunning" passDirection="out"/>
<intParm name="batchJobsEnding" passDirection="out"/>
<intParm name="batchJobsWaitingToRun" passDirection="out"/>
<intParm name="batchJobsHeldOnQueue" passDirection="out"/>
<intParm name="batchJobsOnHeldQueue" passDirection="out"/>
<intParm name="batchJobsOnUnassignedQueue" passDirection="out"/>
<intParm name="batchJobsEndedWithPrtOutWait" passDirection="out"/>
</struct>
<program name="program" path="/QSYS.lib/QWCRSSTS.pgm">
<parameterList>
<structParm name="receiver" passDirection="out" struct="SSTS0100"/>
<intParm name="receiverLength" passDirection="in">80</intParm>
<stringParm name="format" passDirection="in" length="8">SSTS0100</stringParm>
<stringParm name="statusStat" passDirection="in" length="10">*NO</stringParm>
<intParm name="errorCode" passDirection="in">0</intParm>
</parameterList>
</program>
</xpcml>
</soap-env:Body>
再次提醒一下,program元素的name属性必须设置为program。
在响应操作中,只需提取从XPCML返回的系统名称,而XPCML是从业务服务返回的。使用XQuery,将XPCML转换成代理服务要返回的XML,并将其指派给body变量。下面是所用的XQuery:
<soap-env:Body>
<ifiv:getSystemNameResponse xmlns:ifiv="http://ifiveos">
<ifiv:return>
{$body/xpcml/program/parameterList/structParm/stringParm[@name="systemName"]/text()}
</ifiv:return>
</ifiv:getSystemNameResponse>
</soap-env:Body>
现在可以使用控制台来测试该代理。图7显示了测试结果。

图 7. 执行XQuery之后的响应文档
幕后工作
本文的这个小节是专门为有兴趣了解如何实现ALSB和i5/OS直接集成的读者准备的。
ifiveos transport使集成成为可能,它支持从ALSB对i5/OS程序(使用RPG、COBOL和其他语言编写的)进行出站同步调用。图8总结了该架构中的组件。

图 8. 新架构中的组件
重点组件为:
- 代理服务是ALSB向客户端提供服务的公共接口。
- 业务服务是企业系统的定义——在我们的例子中,是程序所在的i5/OS服务器。该定义包括服务器的物理地址、用来登录的账户和其他一些参数。
- ifiveos transport是使用ALSB Transport SDK构建的ALSB扩展。它提供了ALSB和i5/OS之间的连接管理。
- Toolbox for Java是使用Java访问i5/OS资源的IBM库。它提供XML语言(XPCML)和编程接口,该接口用来调用远程系统上的程序。
- 主机服务器是i5/OS基本组件的一部分,提供从客户端到该系统的远程访问。主机服务器使用TCP/IP协议。
- 以RPG、COBOL或C编写的i5/OS程序和命令可以使用XPCML通过此处显示的堆栈进行描述和调用。
下面是该图表中颜色的含义:
- 绿色 – 程序
- 蓝色 – 配置工件
- 红色 – 基础架构组件
- 灰色 – 平台
除了前几节中描述的优势之外,该架构还显示了如何使用XML之类的标准集成两个设计良好的产品。具体而言,以下功能使得集成成为可能:
- ALSB提供了几项方便的抽象(例如传输、绑定),包括Transport SDK,并且它是以XML/XQuery为中心的。它是为互操作性设计的。
- i5/OS提供了XPCML和Java API,以便使用XPCLM文档远程调用程序。
该集成是自然的并且非侵入式的,因为它利用各个平台中已经存在的接口。
最后,ifiveos transport例示了如何扩展ALSB,以便支持与该产品所附带的八种产品以外的其他系统和协议进行互操作。Dev2Dev的CodeShare还提供了其他transport。
结束语
AquaLogic Service Bus可以直接连接到i5/OS,并通过ifiveos transport调用RPG和COBOL程序。借助这种方法,就不需要使用中间应用服务器将i5/OS程序公开成Web服务。ALSB直接连接到i5/OS,并在ALSB支持的任何传输和绑定(例如,Web服务、JMS、XML/HTTP)中将这些程序作为服务公开给客户端,除此之外,Enterprise Service Bus还带来了附加值。
此处描述的架构不需要任何编码,它是配置驱动的,并且基于XML (XPCML)和XQuery。
参考资料
原文出处:http://dev2dev.bea.com/pub/a/2007/04/alsb-ifiveos.html
| 作者简介 |
 Paco Gómez |
Paco Gómez 是BEA公司的资深系统工程师。六年来,他帮助许多客户设计了解决方案架构。他持有工业自动化的硕士学位,在软件行业拥有17年的经验。他与人共同编写了一本WebLogic书,还是WebLogic技术社区的积极捐献者,发表了很多文章和演讲,贡献了一些创新性的工具,比如grinder和wlshell。 |
作者其它文章
|