面向服务的体系架构(SOA)提出了把功能包装成服务的设计理念。服务组件架构(SCA)是一种实现SOA理念的方式。作为编程模型和框架,SCA定义了描述服务和调用服务的标准方法,是WebSphere Process Server(WPS)的核心概念。SCA模块定义和实现各种服务。而绑定使得SCA模块通过不同的协议与其他外部服务或系统交互。绑定分为导入绑定(import binding)和导出绑定(export binding)两种,前者帮助SCA模块调用外部服务,后者使SCA模块能被外部服务使用。
EJB导出绑定
EJB导出绑定是WPS V7.0的新功能。以SCA编程模型实现的组件,可通过EJB导出绑定发布成EJB无状态会话Bean(Stateless Session Bean),以便与外界J2EE环境集成。这样对于那些熟悉 EJB 的客户就能以调用普通 EJB 的方式调用SCA服务。EJB导出绑定支持WSDL接口和Java接口,支持EJB 3.0和EJB 2.1规范,EJB远程调用(Remote Interface)和本地调用 (Local Interface)。
WSDL接口
WPS的数据编程模型是Service Data Objects(SDO)。SDO方便WPS用XML schema描述XML 数据。然而基于Java接口的EJB要求传输数据支持 Java序列化。为了让两者能够对接,我们需要做Java对象到XM数据的转换。幸运的是,业界已经提出一个根据XML schema产生Java类的标准:JAXB(Java Architecture for XML binding)。JAXB提供方法将XM 数据转换成Java对象,也能把Java对象的内容写到XML实例文档。如果用户想通过 Java 接口调用一个实现了WSDL接口的SCA组件,或者手头有一个实现了WSDL接口的服务,想把该服务发布成EJB应用,WebSphere Integration Developer (WID)会自动生成JAXB的类,帮助用户实现XML数据与Java对象的转换。
W-type EJB导出绑定
对于使用 WSDL 接口的 SCA 组件,如 BPEL 等,可以通过W-type EJB导出绑定的方式将该组件发布为EJB无状态会话Bean。
下面我们以一个简单的业务场景为例,介绍如何在WID 7中开发符合EJB 3.0规范的使用EJB远程调用的W-type EJB导出绑定。
创建SCA模块
创建一个包含WSDL接口的SCA模块,提供贷款人资格审查功能。该模块通过客户端输入的贷款人信息来判断是否接受当前贷款人的贷款申请。
我们已为您准备此SCA模块,请点击附件下载,并导入WID。
在Assembly Editor里您将看到一个名为WSDLComponent的SCA组件,它实现如下WSDL接口:
图 1. WSDL接口
在该WSDL接口里使用的参数类型为DataObject。此处的Borrower是我们自定义的一个DataObject,属性amount代表贷款的金额,accepted 表示该贷款申请是否被接受。Borrower包含的信息如下:
图 2. DataObject Borrower
这里validate方法还定义了错误信息(Fault),在具体的接口实现逻辑里可以决定在特殊情况下返回一个错误信息。此处的ServiceFault也是自定义的一个DataObject,它包含的信息如下:
图 3. DataObject ServiceFault
在后文您将看到W-type EJB导出绑定怎样把DataObject 转换为EJB client所用的Java类。
创建W-type EJB导出绑定
在Assembly Editor里右键单击WSDLComponent,选择Generate Export > Enterprise JavaBeans Binding;
图 4. 生成EJB导出绑定
在弹出的New Enterprise Java Bean Export Service对话框中,选择Create an EJB client Jar Module,并新建一个名为EJBExportClient的EJB Client Project用于存放EJB client Jar,然后点击“OK”;
图 5. 新建EJB client Project
选择EJB interface type为Remote,EJB session bean version为EJB 3.0,然后点击“Finish”;
图 6. 生成EJB client JAR
稍等几秒钟,一个新的EJB导出绑定将出现在Assembly Editor中,默认名称为EJBExport,您可以单击EJB导出绑定的文字部分将其重命名为 EJBExport_WSDL_Target;
图 7. EJB导出绑定出现在Assembly Editor里
选中EJB导出绑定,在 Properties 视图里可以看到WID为EJB导出绑定自动生成的一些属性:
图 8. EJB导出绑定的属性
JNDI name:EJB Client 可以通过查找这个JNDI获取EJB导出绑定连接的SCA服务。用户可以自定义JNDI name,然后在EJB Client端查找的时候使用自定义的JNDI name;
Data Handler Type:该数据绑定处理EJB调用使用的Java类与SCA调用使用的DataObject之间的数据转换。默认的数据绑定为 JAXWSDataHandler,用户也可以使用自定义的数据绑定;
Function Selector:Function Selector 用于选择与进入EJB导出绑定的EJB调用相对应的 WSDL 接口方法。默认的Function Selector 为 SLSBExportFunctionSelector,用户同样可以使用自定义的Function Selector。
创建EJB Client
在工作空间中可以看到一个新项目EJBExportClient,这是创建EJB导出绑定时自动生成的。它包含了WSDL接口对应的Java信息,比如EJB远程接口、DataObject对应的Java类等。
单击File > New > Project > Web > Dynamic Web Project,新建名为LoanWeb的Web项目;
右键单击LoanWeb > Properties > Java Build Path,在右边的Project选项卡中,添加EJBExportClient;
图 9. 创建EJBClient
右键单击LoanWeb下的WebContent > New > JSP,新建一个名为index.jsp的页面;
编辑index.jsp,这里只展示调用EJB服务的部分:
清单 1. 部分index.jsp代码
以下是引用片段: String name=request.getParameter(“name”); Integer age=Integer.getInteger(request.getParameter(“age”)); Float yearlyIncome=Float.valueOf(request.getParameter(“yearlyIncome”)); Float amount=Float.valueOf(request.getParameter(“amount”)); Borrower input = new Borrower(); input.setName(name); input.setAge(age); input.setYearlyIncome(yearlyIncome); input.setAmount(amount); InitialContext context = new InitialContext(); WSDLComponentInterfaceRemote mySession = (WSDLComponentInterfaceRemote)context.lookup |–10——–20——–30——–40——–50——–60——–70——–80——–9| |——– XML error: The previous line is longer than the max of 90 characters ———| (“ejbbindings.wsdlcomponentinterface.binding.WSDLComponentInterfaceRemote”); if(mySession != null){ try{ Borrower output = mySession.validate(input); } catch(ValidateFaultMsg fault){ //deal with fault } } |
这样我们就可以在JSP里以访问普通EJB的方式调用SCA服务了。
J-type EJB导出绑定
我们用如下的Java接口为例:
清单 2. Java接口
以下是引用片段: package com.example.binding.ejb; public interface JavaComponentInterface { public Data businessOperation(Data in); } |
对于使用Java接口的SCA组件,如Java模块,可以通过J-type EJB导出绑定的方式将该组件发布为EJB无状态会话Bean。J-type EJB导出绑定同样支持EJB 3.0和EJB 2.1规范,远程调用和本地调用。值得注意的是,Java接口的参数和返回值需要实现 java.io.Serializable接口,这是EJB规范的要求,确保传输数据的可序列化。
创建J-type的EJB导出绑定的过程类似于创建 W-type 绑定。首先我们要创建SCA模块,该模块包含 Java 接口,然后在 Assembly Editor 里右键单击JavaComponent,选择Generate Export > Enterprise JavaBeans Binding。在弹出的New Enterprise Java Bean Export Service对话框中,选择Create an EJB client Jar Module。稍等几秒钟,新的EJB导出绑定将出现在Assembly Editor中,如图 10 所示。
图 10. EJB导出绑定出现在Assembly Editor中
选中EJB导出绑定,在Properties视图里可以看到WID为EJB导出绑定自动生成的JNDI名称,用户可以修改此JNDI名称。
图 11. EJB导出绑定的属性
EJB导入绑定
EJB导入绑定是WPS V6提供的功能。它能帮助SCA模块访问现有J2EE应用。
Java组件通过J-type接口调用EJB服务
EJB应用本身基于Java接口,SCA模块通过Java接口调用EJB是水到渠成的。假设我们有一个运行于应用服务器上的EJB应用,如果SCA模块需要访问它,并且该模块可以使用Java接口,比如SCA模块含有Java组件,我们就在SCA模块里添加EJB导入绑定,为绑定指定Java接口,然后设置EJB的JNDI名称为绑定的目标JNDI,把EJB client JAR设置为SCA模块的依赖项目,最后把Java组件与EJB导入绑定连线,这样我们就完成了SCA模块与EJB应用的集成。
实际生产环境中,我们常常会遇到这种情况:SCA模块和EJB服务运行于同一个单元 (cell) 的不同服务器上,或者SCA模块和EJB服务处于不同cell中,例如在WPS上运行的SCA模块要使用另一个cell里的WebSphere Application Server(WAS)上的EJB服务。这时候我们需要在WAS上配置命名空间绑定 (Name Space Bindings),定义一个在cell级别有效的JNDI名称或者跨越cell的基于CORBA协议的URL,通过命名空间绑定找到目标EJB。
BPEL流程通过W-type接口调用EJB服务
BPEL流程只有WSDL接口。WPS V6的EJB导入绑定只支持Java接口,我们无法把WSDL接口的组件和Java接口的组件直接连线,只能在它们之间添加一个Java组件作桥梁。Java组件需要实现 WSDL 接口,能连线BPEL流程,它把WSDL调用转换成对EJB导入绑定的Java调用。
创建WSDL接口的EJB导入绑定
WPS V7.0和WID V7.0为EJB导入绑定提供了新功能,支持WSDL接口,这样WSDL接口的组件就能直接连线EJB导入绑定。如果WID的workspace里已经有EJB应用,我们可以直接把它的接口拖入需要使用EJB服务的SCA模块里。WID会询问用户是创建Java组件还是EJB绑定。如果用户选择了后者,WID提示用户选择接口的类型,如图 12 所示,缺省是WSDL接口。
图 12. WID提示用户为EJB导入绑定选择接口类型
在《WPS/WESB绑定:玩转EJB绑定(下)》中,我们将继续介绍相关内容。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
事件驱动框架和SOA在空军的应用
空军正在利用SOA来改善数据共享,并实时跟踪战机,美国空军机动司令部的Michael Marek解释了企业可从中学习的经验。
-
揭秘New Relic APM技术细节
New Relic应性能管理(APM)套件主要用于Web软件开发。它允许用户在面向服务的架构(SOA)上跟踪关键事务性能,并且支持代码级别的可见性来评估特定代码段和SQL语句对性能的影响
-
仅凭SOA和云无法解决业务数据管理风险问题
SOA和云可以是某些恼人问题高效的解决方案;这一点我们已经知道了。但是也要记住它们并不是所有事情的直接答案,特别是当你的问题是业务数据管理风险,而不是技术问题时。
-
如何避免云计算与SOA冲突