
 | YkleUe/u0 |
级别: 初级
Vasudevan Thiyagarajan(vthiyaga@in.ibm.com), 系统工程师, IBM India Pvt. Ltd.
n7Z5_ }:M4Cw'WD5kT0
2007 年 3 月 20 日
了
解如何从传统 Java 对象(Plain Old Java™ Object,POJO)开发服务组件,并在 IBM® WebSphere
Enterprise Service Bus 中发布。采用 Web 服务描述语言 (WSDL) 定义接口,并使用 Java™
实现。了解如何将服务组件与独立引用相关联,以及如何使用独立引用跨 ESB 访问服务。
先决条件
本文假定您已经安装了 IBM WebSphere ESB 6.0 和 IBM WebSphere Integration Developer 6.0。
WebSphere Enterprise Service Bus 简介
WebSphere
Enterprise Service Bus
是允许应用程序以灵活方式进行集成的平台,可帮助企业实现其面向服务的体系结构(Service-Oriented
Architecture,SOA)目标。ESB 允许服务使用者和服务提供者彼此进行交互,而其间没有任何直接依赖关系。在 ESB
中,需要其他应用程序的服务的应用程序称为“服务使用者”,而提供服务的应用程序称为“服务提供者”。ESB
将服务使用者和服务提供者分离开,务必注意的是,您可以更改服务使用者或服务提供者的接口定义,而不用修改另一方。
WebSphere Enterprise Service Bus 能够执行以下主要任务,从而将服务提供者与服务使用者分离开来:
- 请求和响应路由:服务提供者和服务使用者之间的全部通信都以消息的形式进行。服务
使用者请求服务,并针对 ESB 创建请求消息。ESB 平台将充当提供者和使用者之间的传输媒介。ESB
将标识实际的服务提供者并将请求传递给提供者。服务提供者完成操作后,将以消息格式生成响应,并随后将其返回给 ESB。ESB
将响应传输回实际的使用者。在整个通信过程中,提供者和使用者都不会意识到彼此的存在。只有 ESB 知道将请求和响应消息路由到何处。
- 消息转换:ESB 允许提供者和使用者使用自己的协议和消息传递格式。他们并没有必要遵循相同的协议和消息格式——ESB 将负责处理不同的协议和不同的消息格式。它知道如何将一种消息格式转换为另一种消息格式,也知道如何将使用一种协议的消息转换为使用另一种协议的消息。
下图说明了 ESB 的角色:
N2g&aC'x&s&t2_0图 1. ESB 概略图
/\lS&N.~VZC+D,k0
e"SDW)H0ITPUB个人空间t'EA'F5]*u [在 WSDL 中创建接口
我们从将摄氏度转换为华氏度的示例服务组件着手进行演示。Temperature Converter 组件具有名为convert的方法,该方法接受以摄氏度表示的给定温度,并将返回对应的华氏度温度作为输出。我们将使用 JavaServer Pages (JSP) 客户机进行测试,此客户机通过独立引用访问该服务组件。
在 WebSphere ESB 中发布的每个服务组件都具有一个定义良好的接口。我们可以在 WebSphere Integration Developer 中为上述服务组件创建接口TemperatureConverterInterface:
uu/yAl s0OCr
\0图 2. 使用 New Java Interface Wizard 创建 WSDL 接口ITPUB个人空间0N#ow'^#x3d
gp7_L XM0如下所示,向上述接口添加具有一个输入和一个输出的请求与响应操作。此处的操作名为
convert,输入为
Celsius as double,输出为
Fahrenheit as double。
ITPUB个人空间ikaXg(v
l)_ITPUB个人空间J&XzDyW8[
ITPUB个人空间Z'I]9v-{(Da从 WSDL 通过 Assembly Editor 将服务组件作为 POJO 实现
ITPUB个人空间F [4ZI.C接
下来,我们为上述接口创建一个传统 Java 对象 (POJO) 实现。我们可以在 Assembly Editor 的帮助下采用 Java
创建实现(服务组件),如下所示。Assembly Editor 属于 WebSphere Integration
Developer,允许开发人员通过接口(导入和导出)和绑定来连接 SCA
组件。我们将此实现命名为“TemperatureConverterImpl.java”。
k:Kc5iO0ITPUB个人空间n\xD3K%n

接下来,我们需要通过“Add Interface”将接口TemperatureConverterInterface与此实现相关联。
FEq*F5T0图 5. 将接口与生成的服务组件相关联ITPUB个人空间v,GH9D;x&Zx
u^ Q] b0
y^^2{8^8QQ-j&Ut0r ]
QifFQ0现在接口已与组件关联。我们可以通过使用“Generate Implementation”选项生成实现的框架。
oa)`,Oo#b1A0图 6. 为新服务组件生成实现ITPUB个人空间}.m)w+u? s
ITPUB个人空间a"Yl1A)J&L3qo$H
W@S3j+h:\D%V1[0图 7. 将实现添加到生成的框架中ITPUB个人空间}T M ~%[!a3G8Y
0?-{t*nG,vRR0
#j.Q$C([_$cF0Z4{0?8r*Z$p0我们需要在上述类中添加convert方法的实现,如下所示:
ITPUB个人空间 X*p1S7MlM%WA"q*v清单 1. Convert 方法实现ITPUB个人空间m#r7}9`~
RyN k/@i0cL6Z,M _0public Double convert(Double celsius) { u)N'~"_%j7F3G0double dCelsius = celsius.doubleValue(); }P4{$S
E/o[c"Y0double fahr;ITPUB个人空间!S
lsvh fahr = (((0.9/0.5) * dCelsius) + 32);ITPUB个人空间L_5~|h+j'A return new Double(fahr);ITPUB个人空间ajtt1VAR%`
rS#?4?2D9v `-H R2a
@"r0 #h#\0T.w(k P/\-A0}
|
}AU#Dv~0将服务组件与独立引用关联
接下来,我们将创建独立引用,并将其与服务组件相关联,以便 JSP 客户机能够通过独立引用访问该组件。
ITPUB个人空间Q+I }r6s8}'q{图 8. 创建独立引用
Oy?5iT\V1P0
c ID5J3xvP0
ITPUB个人空间P^5@*?9xx \B我们可以通过“Add Reference”按钮将TemperatureConverterInterface.wsdl与独立引用相关联。缺省情况下,独立引用将被命名为TemperatureConverterInterfacePartner。
|SU1n\vGZ#eP0图 9. 将独立引用与服务组件连接
8u
d;}#sw#YjL4A'I0
/I `!Da5C0
0CWT'AY` hZ`,k0#ZsWVtn B ]0创建客户机,并通过独立引用访问服务
接下来,我们需要开发客户机 JSP 来测试服务组件。此 JSP 将允许用户输入摄氏度值。随后 JSP 会将该值传递给服务,以将其转换为华氏度,并最后显示结果。
ITPUB个人空间8b0G1H%I,rV0b图 10. 新 JSP 文件模板
-d$UA8} lH#N0ITPUB个人空间7E k.j@'J
qB4Z#ry0将随后使用下面所示的 ServiceManager 类通过 JSP 调用组件。
w)fN m0[:] ma"u&_h0清单 2. JSP 实现~v-\
R Za+GO#Z0
1l].Y.Fd(G
K0String cel = request.getParameter("celcius");
Gi0hp%U$m&ZnA0if(cel != null && cel.length() > 0){ITPUB个人空间{]'u4MU
try{ITPUB个人空间
InO
w&uv3Mww
ServiceManager serviceManager = new ServiceManager();
6Na6ERG4I#e0Service service = (Service) serviceManager.locateServiceITPUB个人空间t-W u#vs0_:O
("TemperatureConverterInterfacePartner");ITPUB个人空间E0@%kA-q;CJq
Double celDouble = Double.valueOf(cel);
fS-L?Ze0DataObject respObject = (DataObject) service.invoke("convert", celDouble);
xT#U*g,NUb~I/?.NZ0if(respObject!= null){
Vj3n%l"NP%w2R"?,D0out.println(respObject.getDouble("Fahrenheit"));ITPUB个人空间F.[/`sv_)V-s|.g+[
}
)S-C9T0q/N"lY;g/m0}catch(Exception e){ITPUB个人空间K:g
W*I&pDeb
//handele itITPUB个人空间dyD
I%G8W*?
}ITPUB个人空间vKjN
dT3o
}
ITPUB个人空间A;AMy;?4f]