级别: 中级 Ying Ji Sun, 软件工程师, IBM Simon Holdsworth, 架构师, IBM Jim Ramaker, 执行编辑,developerWorks WebSphere 网站团队, IBM
2009 年 5 月 13 日 本文向您介绍如何修改 WebSphere ESB 中的 SCA 模块以包括 WebSphere Web Services Feature Pack,并获得对它提供的附加服务质量的访问权限,以便调用 Web 服务并在 SCA 模块中提供这些服务。
1. 引言
下图显示了一个 SCA 中介模块,已对该模块进行了修改以包括对 Web Services Feature Pack (WSFEP) 的使用。为了使用 WSFEP 提供 Web 服务端点,已添加了一个包含 Bridging bean 的路由器模块,为 SCA 导出提供了一种接收 Web 服务请求的替代方法。为了使用 WSFEP 调用 Web 服务,已添加了一个自定义 Java Bridging Component 作为 SCA 导入的替代方法。可以在一个模块中单独进行这两种修改,也可以一起修改,如本中介模块中所示:
图 1. SCA 模块中的桥接场景
- 在 WSFEP 模块中,Bridging bean 是一个启用 JAX-WS 的 Java Bean,用于提供 Web 服务端点,并通过独立引用来调用 SCA 组件。
- 在 SCA 中介模块中,Bridging component 是一个 SCA POJO 组件,该组件使用 JAX-WS API 调用 Web 服务。
- 这两个构件在应用程序中表示为两个独立的 WSFEP 端点,每个端点都有其自己的策略集配置。
2. 设置开发和运行时环境
2.1. 安装运行时
本文中的示例需要在干净环境中运行,因此在前两步中请不要创建任何概要:
- 安装 WebSphere ESB V6.1.2,其中包括 WebSphere Application Server V6.1.0.17 和 WebSphere ESB V6.1.2。
- 安装 WSFEP。
- 使用程序包
6.1.0.9-WS-WASWebSvc-IFPK53084.pak 进行更新。
- 使用程序包
6.1.0-WS-WASWebSvc-WinX32-FP0000017.pak 进行更新。
对于较新版本的产品,可能存在一些区别,因此应创建名为 AppSrv01 之类的 WSFEP 独立服务器,并使用 WebSphere ESB 概要进行扩充。您的 WebSphere Application Server 和 WSFEP 版本可能与本文中的不同,但它们必须相互匹配。
2.2. 安装开发工具
- 安装 Rational Application Developer V7.0.0.0。
- 在获得 Rational Application Developer V7.0.0.6 和 WebSphere Integration Developer V6.1.0.100 之前,使用安装管理器更新程序包
3. 实现
3.1. 概述
此部分描述中介模块中的组合场景。如果愿意,您可以单独实现个别端点支持和调用。通过三种构件组合创建桥接场景应用程序:
- WS FEP 服务
- 提供最终由 SCA 中介模块中的桥接组件调用的 JAX-WS Web 服务。
- 桥接应用程序
- WSFEP 增强的 SCA 中介模块,能够调用需要附加服务质量并由 WSFEP 支持的应用程序并能够被这些应用程序调用,如 SOAP 1.2 和 WS-RM。
- 客户端
- JAX-WS 客户端应用程序,用于调用由桥接应用程序提供的 Web 服务。
在构建这些构件之后,将它们导出到 EAR 文件,并将其部署到服务器进行测试。您可以将策略集添加到 EAR 文件,以应用由 WSFEP 引入的新的 Web 服务策略。
3.2. 开发 WSFEP 服务
此部分描述如何创建使用 WSFEP 的 Web 服务提供者应用程序。此应用程序将从下一部分中描述的桥接应用程序调用。
- 启动 Rational Application Developer 并创建新的工作区。
- 依次选择 Windows => Preferences => Installed Runtime => New Server Runtime。
- 运行时的类型应是 WebSphere Application Server V6.1,并应指向您的安装目录。
- 创建新的 Dynamic Web Module,并为您新创建的服务器运行时设置 Target runtime。单击 Next。
- 在下一屏幕中,选中 WebSphere V6.1 Feature Pack for Web Services 并单击 Finish。
- 我们提供了一个名为
GreeterImpl.java 的 Java POJO 类,该类实现用作入站服务端点以桥接到 SCA 组件的 Web 服务的基本功能。
清单 1. 服务实现
package services.impl;
public class GreeterImpl{
public String sayHi() {
return "Hi";
}
public String greetMe(String requestType) {
return "hello " + requestType;
}
public void greetMeOneWay(String requestType) {
}
}
|
- 创建一个名为
services.impl 的包并将 Java 文件复制到该包。
- 在工作区中创建一个 Web 服务,并将 Service Implementation 设置为
services.impl.GreeterImpl。将 Web service runtime 更改为 IBM WebSphere JAX-WS。 将级别调整为 Assemble service,并单击 Next。
- 在下面的屏幕中,选中 Generate WSDL file into project 并单击 Finish:
图 2. Rational Application Developer 为 Web 服务服务器生成的文件和文件夹
现在已经有了一个 WS FEP 增强的 Web 服务。
3.3. 开发桥接应用程序
此部分描述如何使用 WSFEP 开发调用 Web 服务并公开 Web 服务端点的 SCA 中介模块,这等效于在模块中将启用 WSFEP 的导入和导出进行绑定。这些步骤适用于任何 SCA 模块,并可以单独应用这些步骤在 SCA 模块中调用 Web 服务或公开 Web 服务。
- 在同一工作区中,单击 File => New => Mediation Module 以创建名为
SCAModule 的 SCA 中介模块。将其 Target Runtime 设置为 WebSphere Process Server V6.1。
- 在 Data Types 节点下,创建一个新的名为
StrObj 的 BO,并将 string-typed 属性值命名为 val。此 BO 用于在中介模块中携带信息。
- 创建一个名为
SCAIntf 的接口,并添加一个名为 greetMe 的操作,其输入和输出类型为 StrObj。
- 向中介组件添加接口和引用。
- 添加独立引用和 Java 组件,并将它们链接到 SCA 模块。接受缺省设置。
- 双击 SCAModule 并链接到请求流和响应流中。
- 在下面几个步骤中,您将修改 Java 组件,以支持 SCA 模块访问 WSFEP Web 服务。但在修改 Java 组件之前,您需要创建一些用于访问 Web 服务的附加构件。Rational Application Developer 可以自动生成这些构件。
- 创建一个名为
WSFEPClient 的 Java 项目,这是一个临时项目,用于生成一些具有 WSFEP 功能的构件,这些构件在非 WSFEP 增强的项目中不易生成。在该项目中,创建一个 Web Service Client。从 WSFEPService 模块中将 Service definition 设置为 GreeterImplService.wsdl。
- 将 Web service runtime 设置为 IBM WebSphere JAX-WS,并单击 Finish。新文件即在
services.impl 包中生成,这些文件将用于 SCAModule 中的 Java 组件。
图 3. Rational Application Developer 为 Web 服务客户端生成的文件和文件夹
- 将该数据包复制到 SCAModule 中。为解决编译错误,请将其添加为外部 JAR
<WAS_ROOT>/runtimes/com.ibm.jaxws.thinclient_6.1.0.jar。
- 修改 Java 组件。将以下代码段添加到函数
greetMe 下。按 Ctrl + Shift + O 导入所需的类:
清单 2. Java 组件的中示例代码
public DataObject greetMe(DataObject input1) {
//TODO Needs to be implemented.
System.out.println("into java component");
String name = input1.getString("val");
try{
GreeterImplDelegate port = (new GreeterImplService()).getGreeterImplPort();
input1.setString("val", port.greetMe(name));
}catch(Exception ex){
ex.printStackTrace();
System.out.println(ex.getMessage());
input1.setString("val", "Error in java component");
}
return input1;
}
|
- 现在已经有了可以使用 WSFEP 调用 Web 服务的 SCA 模块。在以下步骤中,您将增强 SCA 模块,以便它可以提供启用 WSFEP 的 Web 服务。
- 创建一个新的动态 Web 模块,并将其命名为
Your SCA module name + Web(在本例中为 SCAModuleWeb)。必须遵循此命名约定才能将 Web 模块添加到您的 SCA 模块应用程序。将项目添加到您的 SCAModuleApp。
- 将 SCAModuleWeb 的 Targeted runtime 更改为 WebSphere Application Server V6.1(2)(其中包含 WS-FEP 功能),并添加 Library => Server runtime => WPS。
- 创建名为
scaServiceWeb.impl 的程序包以及名为 SCAServiceWebImpl 的 Java 类,并按如下所示添加一个方法。保留该方法的名称为 greetMe,使之对应于 SCA 模块接口的名称,但这不是必需的。 该代码用于调用 SCAModule 独立引用。
清单 3. SCA 模块中的示例服务实现
import com.ibm.websphere.bo.BOFactory;
import com.ibm.websphere.sca.Service;
import com.ibm.websphere.sca.ServiceManager;
import commonj.sdo.DataObject;
public String greetMe(String requestType) {
String ref = "SCAIntfPartner";
String wsdlOperation = "greetMe";
String rtnStr = "error";
try {
ServiceManager sm = new ServiceManager();
Service service = (Service) sm.locateService(ref);
BOFactory bof = (BOFactory) sm.locateService("com/ibm/websphere/bo/BOFactory");
DataObject inWrapper=
bof.createByElement("http://SCAModule/SCAIntf",wsdlOperation);
DataObject input = inWrapper.createDataObject("input1");
input.setString("val", requestType);
System.out.println("invoking");
DataObject output = (DataObject) service.invoke(wsdlOperation,input);
System.out.println("invoked");
if (output!=null) {
System.out.println("Result" + output.getString("val"));
rtnStr = output.getString("val");
}else{
System.out.println("Null");
}
} catch (Exception e) {
System.out.println(e);
}
return rtnStr;
}
|
- 使用此 Java 文件创建一个 Dynamic Web Module。将 Service implementation 设置为
scaServiceWeb.impl.SCAServiceWebImpl,并将 Web service runtime 设置为 WebSphere JAX-WS。
- 在下一页中选中 Generate WSDL file into the project,并单击 Finish。您将看到与图 2 中类似的文件夹和文件。
- 现在已经有了 WSFEP 增强的 SCA 模块,该模块可提供启用 WSFEP 的 Web 服务。您可以在此处附加策略集,这将在下面介绍。
3.4. 开发客户端应用程序
此部分描述如何开发可用于调用刚才完成的模块的客户端应用程序。
- 开发客户端应用程序的过程类似于“开发桥接应用程序”下的步骤 9,不同的是您从
SCAModuleWeb 将服务定义设置为 SCAServiceWebImplService.wsdl。
- 创建一个独立的 Java 项目,以使用下面的代码段调用 SCAModule 提供的 WSFEP Web 服务。按 Ctrl + Shift + O 导入所需的类,并添加以下代码:
清单 4. 用于调用 Web 服务的客户端项目的示例代码
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
SCAServiceWebImplDelegate port = (new SCAServiceWebImplService())
.getSCAServiceWebImplPort();
System.out.println(port.greetMe("sunyj"));
}catch(Exception ex){
ex.printStackTrace();
}
}
|
3.5. 部署 EAR 文件
现在已经完成了开发桥接应用程序,下面可以部署项目了:
- 将
SCAModuleApp 导出到 SCAModuleApp.ear。
- 将
WSFEPServiceEAR 导出到 WSFEPServiceEAR.ear。
- 将这两个 EAR 文件部署到应用服务器,并使用管理控制台启动它们。
- 运行
Client.java。您应能够得到返回值 hello sunyj。
3.6. 附加策略集
使用 WSFEP 运行时的主要原因是,这样可以配置它提供的附加服务质量(使用策略集完成)。此部分向您介绍如何向您刚才添加到 SCA 模块的 Web 服务端点添加策略集。我们以 WSAddressing default 为例:
- 右键单击 SCAModuleWeb,并选择 New => Others => Server Side Policy Set Attachment。
- 选择 WSAddressing default。Service Ear Project 应为
SCAModuleApp。现在已经完成向服务器端添加策略集:
图 4. 向服务器端应用程序添加策略集附件
- 右键单击 Client,并选择 New => Others => Client Side Policy Set Attachment。
- 选择 WSAddressing default,输入
Default Binding,并单击 Finish。
- 如果您在使用独立 Java 项目作为客户端,则请使用位于本文底部下载文件中的策略集,而不是 Rational Application Developer 生成的策略集。
现在已经完成了向 WS endpoint 两端添加策略集,如上面的图 1 中所示。下面需要将该策略集与 Bridging Component 进行关联。我们以 WSReliableMessageing 为例:
- 选择 WSFEPService,并创建 Service Side Policy Set Attachment。我们以
WSReliableMessageing default 为例。将 Service Ear Project 设置为 WSFEPServiceEAR,并单击 Finish。由于 SCAModule 是在 WebSphere Process Server 运行时上构建的,您无法通过 Rational Application Developer 向导使用该方法创建 JAX-WS 客户端代码,因此,无法直接添加客户端策略集附件。替代方法:
- 选择 WSFEPClient,并创建 Client Side Policy Set Attachment。在 Policy Set 下拉列表中,选择 WSReliableMessaging default 并在 Binding 中输入
Default Binding。单击 OK => Finish。
- 在 META-INF 中生成了多个文件。将
SCAModule 导出到 SCAModuleApp.ear,并将这些文件复制到 SCAModuleApp.ear\META-INF\。
现在已经完成向桥接组件的两端添加策略集。现在需要重新部署 EAR 文件。在管理控制台中,依次选择 Enterprise Applications => SCAModuleApp => Service provider policy sets and bindings。策略集已附加到该应用程序。图 5 显示了桥接组件的服务提供程序策略集和绑定:
图 5. 管理控制台中显示的策略集信息示例
4. 运行结果
- 作为应用程序运行
Client.java。您应能够得到返回值 hello sunyj。
- 如果检查 WS 端点中的请求/响应消息(图 1),则会看到消息中添加了下面的代码段:
图 6. WSAddressing 的请求/响应消息中的代码段
- 如果检查桥接组件中的请求/响应消息(图 1),则会看到消息中添加了下面的代码段:
图 7. WSReliableMessaging 的请求/响应消息中的代码段
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Standalone java client policy set of WSAddressing | java_client_policy_set.zip | 3 KB | HTTP |
|---|
参考资料
作者简介  | |  |
Ying Ji Sun 是 IBM 中国开发中心的软件工程师。他目前在 WebSphere Enterprise Service Bus 功能验证测试团队工作。 |
 | |  |
Simon Holdsworth 是位于英国的 IBM Hursley Software Lab 的 WebSphere 业务集成产品的一名软件架构师。他在 WebSphere Enterprise Service Bus 和 WebSphere Process Server 团队工作,并且是 osoa.org 的 SCA、JMS 和 Web 服务绑定规范的编辑。他以前在 IBM 负责 Web Services Gateway、MQSeries Integrator、Component Broker、DSOM 和 CICS 开发方面的工作。他拥有英国布里斯托大学数理逻辑和计算理论的学士学位。 |
 | |  |
Jim Ramaker 是位于美国加利福尼亚州圣何塞市的 IBM Silicon Valley Lab 的 developerWorks WebSphere 网站团队的执行编辑。他是以下 WebSphere 产品的编辑:WebSphere Enterprise Service Bus、WebSphere Message Broker、WebSphere MQ 和 WebSphere DataPower SOA Appliances。 |
对本文的评价
|