级别: 初级 Greg Flurry (flurry@us.ibm.com), 高级技术人员, IBM Software Group
2002 年 11 月 01 日 如果您已经从 IBM alphaWorks 下载了版本为 3.2.2 的 Web Services Toolkit,那么您就已经获得了 Web 服务总线,它是构建 Web 服务处理器的框架。在这个由两部分组成的系列中,Greg Flurry 将向您展示怎样开始使用总线,使 Web 服务的创建更快更容易。在这第一部分中,您将会学到总线基于 UDDI 的发现机制,并且研究一种有助于实现 Web 服务发布过程自动化的实验性方法。
Web 服务总线(您可以在 IBM alphaWorks 的 Web Services Toolkit 版本 3.2.2 中找到它)是构建 Web 服务处理器的框架。您可以利用总线创建 Web 服务客户机、服务器、网关、中介者等(请参阅
参考资料)。总线在其他 Web 服务框架的基础上还提供了一种增强的环境来通过 Web 服务实现动态电子商务。它通过客户机端
入站(on-ramp)支持服务需求者并通过服务机端
出站(off-ramp)支持服务提供者。总线因为继承了 Web 服务调用框架(WSIF)的特点,其核心为 WSDL;在总线出站(称为
总线服务)中部署的 Web 服务可以用 WSDL 来描述,而且出站可以为总线服务自动生成 WSDL。另外,总线出站还可以在 UDDI 注册中心随意发布关于总线服务的信息。
此外,总线还支持总线入站内形式化的、可插的
发现和
选择机制。简而言之,总线接受 WSDL 端口类型的特定实现的请求,但是调用发现和选择机制把请求发往不同的实现。可插的发现和选择机制可以运用想用的任何手段来找到候选的实现,然后从候选者中挑选出想要的实现。
总线原型(WSTK 3.2.2 中的一部分)包含许多总线各种功能的展示,包括基于 WSIL 的发现机制。在这篇文章中,您将学到如何使用各种总线功能去实现基于 UDDI 的发现机制。关于其他详细信息请参阅总线原型实现附带的文档。读过这个系列后,您也许会发现参见
图 1中的总线体系结构是有用处的。
图 1. Web 服务总线体系结构
普通安装
在运行这篇文章的示例代码之前,您将需要进行必须的初始安装才能运行任何与 WSDK 或 WSTK 相关的代码。首先,您必须安装并配置 Web Services Development Kit(从 IBM developerWorks 中可以获得)。WSDK 包含示例中所需的专用 UDDI 注册中心的实现。第二,您必须安装并配置版本为 3.2.2 的 Web Services Toolkit(从 IBM alphaWorks 中可以获得);WSTK 包含 Web 服务总线原型实现。这篇文章的示例假设 WSTK 是安装在 WSDK 中的,但并不必要完全按照那样安装,但是,您必须配置 WSTK 来使用 WSDK 提供的专用 UDDI 注册中心。您可以在下面
参考资料部分找到 WSTK 和 WSDK 的链接。
一旦安装好 WSDK 和 WSTK,您应该启动 WSDK (或任何的您在使用的 Web 应用程序服务器),并且进行一些尝试来确认您的安装是否正确。首先,您需要在 GUI 中为 UDDI 注册中心指定一个新的浏览器实例,可以从
http://<hostname:port>/uddigui/ 获得,其中
<hostname:port> 代表安装 UDDI 注册中心的机器和端口。除非您已经把 WSTK 配置成使用其他的值,否则请务必在登录时使用缺省用户名(
demo )和缺省密码(
pwd )。您应该会看到一个类似
图 2的页面(您也许必须调整大小或滚动)。
图 2. UDDI 注册中心 GUI
接下来,您必须确认总线原型能正常运行。打开命令窗口转到
WSTK_HOME/services/demos/wsbus/client ,其中
WSTK_HOME 指明您安装 WSTK 3.2.2. 的目录。在此目录中运行演示一次或多次;
SimpleClientFilter.bat 是个不错的演示,因为它对总线的客户机端和服务器端都进行测试。如果演示运行顺利,请准备好继续进行其他安装。
准备示例
存在许多针对本文中所描述示例的安装。在开始运行代码之前,您将需要:
- 创建代表服务实现的 JavaBean。这包括创建描述服务实现的 WSDL。
- 启动专用 UDDI 注册中心。这包括插入一个虚构的业务,这个业务将拥有为示例而创建的各种实体,并插入 UDDI tModel,它对应于由上述服务实现来实现的 WSDL 端口类型。
- 在总线中部署 JavaBean 作为总线服务。
- 测试部署的总线服务。
我将依次指导您进行每一个步骤。
创建服务 JavaBean
这些示例运用了普遍存在的股票报价服务的三个实现。
清单 1 展示了其中一个实现的源代码
SQ1.java 。
清单 1. SQ1.java,股票报价服务
package gaf.uddi.sq;
public class SQ1 {
public float getQuote(String symbol) {
return (float) 155.25;
}
}
|
注意:为简单起见将省略传入的符号。其余的服务实现(
SQ2.java 和
SQ3.java )与该实现类似,但产生不同的值。它们三个的源文件和类文件可以在本文中附带的
代码包中找到。您必须为 WSTK Web 应用程序可用的 bean 创建类文件;方法是把这些文件放入相对于 Web 应用程序服务器的已安装应用程序目录的
wstk.ear/wstk.war/WEB-INF/classes/gaf/uddi/sq 目录中。
总线支持用来描述部署在总线内部服务实现的几种选项。这个示例运用 WSDL 的唯一选项来确保总线能辨认所有三个服务实现相同的 WSDL 端口类型。
清单 2 展示了用于描述端口类型的 WSDL 即 JavaBean SQ1、SQ2 和 SQ3 实现的
SQ.wsdl 。
清单 2. 这些示例实现的描述端口类型的 WSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="SQ" targetNamespace="http://sq.uddi.gaf/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://sq.uddi.gaf/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<message name="getQuoteRequest">
<part name="symbol" type="xsd:string"/>
</message>
<message name="getQuoteResponse">
<part name="result" type="xsd:float"/>
</message>
<portType name="SQ">
<operation name="getQuote" parameterOrder="symbol">
<input message="tns:getQuoteRequest" name="getQuoteRequest"/>
<output message="tns:getQuoteResponse" name="getQuoteResponse"/>
</operation>
</portType>
</definitions>
|
清单 3 包含
SQ1Java.wsdl ,它是用于 SQ1 实现的 WSDL。注意 WSDL 导入
清单 2中的端口类型,并且包含一个在总线中使用 WSDL 部署 JavaBean 所需的 Java 绑定。SQ2 和 SQ3 的 WSDL 代码是相同的(除了绑定的过程、服务和类名之外)。
清单 3. 用于 SQ1 实现的 WSDL 的 SQ1Java.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="SQ1Java" targetNamespace="http://sq.uddi.gaf/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:format="http://schemas.xmlsoap.org/wsdl/formatbinding/"
xmlns:java="http://schemas.xmlsoap.org/wsdl/java/"
xmlns:tns="http://sq.uddi.gaf/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<import location="SQ.wsdl" namespace="http://sq.uddi.gaf/"/>
<binding name="SQ1JavaBinding" type="tns:SQ">
<java:binding/>
<format:typeMapping encoding="Java" style="Java">
<format:typeMap formatType="java.lang.String" typeName="xsd:string"/>
<format:typeMap formatType="float" typeName="xsd:float"/>
</format:typeMapping>
<operation name="getQuote">
<java:operation methodName="getQuote"
parameterOrder="symbol" returnPart="result"/>
<input name="getQuoteRequest"/>
<output name="getQuoteResponse"/>
</operation>
</binding>
<service name="SQ1Service">
<port binding="tns:SQ1JavaBinding" name="SQ1JavaPort">
<java:address className="gaf.uddi.sq.SQ1"/>
</port>
</service>
</definitions>
|
WSDL 包含在本文的
代码包中。所有四个 WSDL 文件(
SQ.wsdl 、
SQ1Java.wsdl 、
SQ2Java.wsdl 和
SQ3Java.wsdl )必须放在相对于 WSTK Web 应用程序安装目录的
WEB-INF/wsbus/wsdl 中。
预先准备好专用 UDDI 注册中心
总线出站根据用来发布 WSDL Web 服务的最佳实践有选择地把已部署的服务发布到 UDDI 注册中心(请参阅
参考资料,来了解更多这些最佳实践)。在下一步,我将利用这些功能在部署服务时自动发布它们。然而,为了使总线能够把服务发布到 UDDI 注册中心内,您必须首先发布一个将拥有已发布的服务的业务实体。总线出站缺省的配置包括您可以使用的业务的名称和描述;如果因为某个原因已经改变了该业务的缺省值,您应该相应地调整下列这些步骤。
您可以使用 UDDI 注册中心 GUI 来发布业务。请单击 Publish 选项卡;然后在 Advanced Publish 下单击 Add a Business。将业务名命名为“Placeholder”,并用“This holds services for WS Bus”作为业务描述(假设缺省总线配置)。然后单击 Publish Business。您将看到确认页。在 GUI 的左面板上,朝下滚动并单击 Show Owned Entities;您将看到类似于
图 3的画面,它说明用户
演示 不拥有服务类型,只有不带有服务的单个业务。
图 3. 显示 UDDI 注册中心 GUI 内已有的实体
我已经简要讨论过,总线可以根据实践有选择地发布已部署在 UDDI 注册中心的服务,这些实践使用 tModel 来识别绑定和端口类型。我的示例代码利用这些选项帮助查找注册中心内股票报价服务端口类型的实现。为了发布上述股票报价服务的端口类型 tModel,请复制批处理文件
makeTModel.bat (可以从这篇文章的
代码包中获得)到
WSTK_HOME/services/demos/wsbus/client ,其中
WSTK_HOME 指的是您安装 WSTK 3.2.2. 的目录。批处理文件有一个引用股票报价端口类型 WSDL 的硬编码的 URL;如果您用的是其他的主机名或端口号,就需要修改该文件。一旦批处理文件包含正确的 WSDL 端口类型引用,请执行它。如果执行成功,使用 UDDI 注册中心 GUI 再次显示已有的实体。您应该看一下如
图 4中显示的信息面板。
图 4. 执行 makeTModel.bat 后显示已更新的已有的实体
注意:tModel 名为 SQ,它对应于 SQ 端口类型。另外 2 个 tModel 是实践的构件,我不需要再深入讨论它们。
部署 JavaBean
现在可以把实现股票报价端口类型的 JavaBean 部署在总线端口原型中。为了能够在 UDDI 注册中心自动发布,注册中心本身必须部署在总线中。
清单 4 包含了
deployForUDDI.xml ,这个部署描述符用于部署 UDDI 注册中心和服务实现。
清单 4. deployForUDDI.xml
<deploy force="true">
<uddiInfos>
<uddiInfo name="uddi1" userName="demo" password="pwd"
inquiryURL="http://localhost:80/uddisoap/inquiryapi"
publishURL="http://localhost:80/uddisoap/publishapi" />
</uddiInfos>
<busServices>
<busService serviceName="SQ1" audited="false" started="true"
configuredPartRep="1" resolvedPartRep="1" authorized="false"
uddiTModelName="UNSPSC" uddiKeyValue="84121801"
uddiKeyName="Stock market trading services"
portTypeNamespace="http://sq.uddi.gaf/" portTypeLocalName="SQ" >
<channels>
<channelReference channel="axis"/>
</channels>
<targetServices>
<targetService serviceName="SQ1Service" started="true" locationType="1"
location="http://localhost:80/wstk/wsbus/wsdl/SQ1Java.wsdl"
serviceNamespace="http://sq.uddi.gaf/" />
</targetServices>
<uddiReferences>
<uddiReference uddi="uddi1" />
</uddiReferences>
</busService>
<busService serviceName="SQ2" ... >
...
</busService>
<busService serviceName="SQ3" ... >
...
</busService>
</busServices>
</deploy>
|
清单 4中的第一个元素包含了关于这个示例中专用 UDDI 注册中心的信息。根据主机名和端口号,您可能必须编辑注册中心的有关信息。第二个元素包含了关于三个服务实现的信息;
清单 4 中展示的完整信息只适用于 SQ1,因为除名字信息外,其他两个服务实现的信息与 SQ1 相同。每个
<busService> 都包含指示如何对总线服务进行分类的属性;这种情况下,
uddiTModelName 、
uddiKeyValue 和
uddiKeyName 的属性表明(无须惊奇)该服务是用于处理股票交易的。每个
<busService> 还包含指示由服务实现的端口类型的属性;这种情况下,
portTypeNamespace 和
portTypeLocalName 属性对应于上述 SQ 端口类型。与使用 UDDI 注册中心时一样,您可能必须修改用来描述服务的 WSDL 文档的位置的主机名和端口号,以便与您自己的系统的合适的值相匹配。
为了把 JavaBean 确实地部署到总线作为总线服务并在 UDDI 注册中心内自动发布总线服务,复制部署描述符
deployForUDDI.xml (可以从本文中
代码包中获得)到
WSTK_HOME/services/demos/wsbus/client/deployment ,然后从代码包中复制批处理文件
deployForUDDI.bat 到
WSTK_HOME/services/demos/wsbus/client 。运行这个批处理文件;如果看到消息
Results: OK ,您已经成功地发布了该服务。
要确认发布,请使用 UDDI 注册中心 GUI 展示已有的实体。
图 5显示您将会得到的结果(如果您要求显示服务);您应该看到所有三个服务。
图 5. 展示样本业务所拥有的服务的已注册业务
如果朝下滚动,您将会看到现在有其他的 tModel。名为
SQApacheAxisBinding 的 tModel 对应于 SOAP/HTTP 绑定,它反映由总线原型公开的 Apache 轴通道(Axic channel)。其他的 tModel 是实践的构件,可以被忽略。
测试总线服务
为了进一步测试部署,请把
SQClient.java 的类文件从本文的
代码包复制到
WSTK_HOME/services/demos/wsbus/client/examples 里。然后把批处理文件
runSQ.bat 从代码包复制到
WSTK_HOME/services/demos/wsbus/client 。
清单 5 显示了
SQClient.java 源代码的片段。
清单 5. SQClient.java 部分源代码的清单
package services.demos.wsbus.client.examples;
public class SQClient {
static String serviceURL = null;
public float getQuote(String symbol) throws Exception {
System.out.println(
"Discovering and selecting a Stock Quote Service instance.");
QName qname = new QName("http://sq.uddi.gaf/", "SQ");
System.setProperty(
WSIFServiceFactory.WSIFFACTORY_CLASSNAME,
"com.ibm.wsbus.wsif.WSIFBusServiceFactory");
WSIFBusServiceFactory serviceFactory =
(WSIFBusServiceFactory) WSIFServiceFactory.newInstance();
WSIFService service = serviceFactory.getService(qname, serviceURL);
WSIFPort port = service.getPort();
WSIFOperation operation = port.createOperation("getQuote");
WSIFMessage input = operation.createInputMessage();
WSIFMessage output = operation.createOutputMessage();
WSIFMessage fault = operation.createFaultMessage();
System.out.println(
"Invoking the selected Stock Quote Service instance.");
input.setObjectPart("symbol", symbol);
operation.executeRequestResponseOperation(input, output, fault);
return output.getFloatPart("result");
}
public static void main(String[] args) throws Exception {
if (args.length != 1) {
usage();
return;
}
serviceURL = args[0];
String symbol = "XXX";
SQClient client = new SQClient();
float result = client.getQuote(symbol);
System.out.println(symbol + " = " + result);
}
}
|
SQClient 运用类似 WSIF 的技术调用 Web 服务,首先使用服务工厂(service factory)从描述服务的 WSDL 获得服务的表示。SQClient 通过适当地设置系统属性,迫使服务工厂专用于 Web 服务总线。因为服务工厂被赋予一个
限定名(在这个例子中为名称空间和本地名称)来创建服务,它使总线发现和选择机制的调用与总线入站内创建服务同时发生。
批处理文件
runSQ.bat 导致客户机入站,以使用与 WSTK 安装在一起的缺省的发现和选择机制。这些机制简单地返回给予它们的信息,即它们允许总线入站效法标准 WSIF 的行为。当执行
runSQ 时将会看到这一点,您可以采取如下语法:
runSQ.bat "http://localhost/wstk/wsbus/ServiceDefinition?name=SQ<n>"
|
其中
<n> 可以是
1 、
2 或
3 ,这取决于这三个服务中的哪一个是您希望调用的。注意:服务的 URL 利用总线出站的能力,自动地为已部署的总线服务生成 WSDL。
如果执行
runSQ.bat ,您将在命令窗口看到与
清单 6相似的代码。
清单 6. 执行 runSQ.bat:结果
C:\wstk-3.2.2\services\demos\wsbus\client>runSQ.bat "http://localhost/wstk/wsbus
/ServiceDefinition?name=SQ2"
***
Invocation of a Stock Quote Service -- default discovery and selection
***
Discovering and selecting a Stock Quote Service instance.
using WSIFServiceFactory
Sample Discovery: giving you what you gave me!
Sample Selection: giving you what you gave me!
Invoking the selected Stock Quote Service instance.
XXX = 255.25
|
注意:发现和选择机制样本给出的指示表明它们实际上什么也没做。如果为其他总线服务执行
runSQ.bat ,您应该看到相似的结果。
基于 UDDI 的发现
最后,您准备尝试基于 UDDI 的发现,因为所有的基本代码片段已经就绪。作为最后一步,您将需要使用 UDDI 注册中心的定制的发现实现。
清单 7包含基于 UDDI 发现实现的代码片段。
清单 7. 基于 UDDI 发现实现的部分代码清单
package services.demos.wsbus.client.selection;
public class UDDIDiscovery implements BusDiscovery {
private PortTypeFinderUDDI finder = null;
public UDDIDiscovery() {
System.setProperty(
org.uddi4j.transport.TransportFactory.PROPERTY_NAME,
WSTKConstants.TRANSPORT_CLASS);
finder = new PortTypeFinderUDDI();
finder.setInquiryURL(WSTKConstants.UDDI_INQUIRY_URL);
}
public final Object[] discovery(QName portTypeQName, String wsdlReference)
throws WSBusException {
System.out.println("UDDI Discovery: finding services in UDDI!");
return find(portTypeQName);
}
public final Object[] discovery(
QName portTypeQName,
Definition wsdlDefinition)
throws WSBusException {
System.out.println("UDDI Discovery: finding services in UDDI!");
return find(portTypeQName);
}
private String[] find(QName portTypeQName) throws WSBusException {
String[] wsdlURL = null;
Vector wsdl = new Vector();
try {
BindingDetail bd =
finder.findImplementations(
portTypeQName.getNamespaceURI(),
portTypeQName.getLocalPart());
Vector btv = bd.getBindingTemplateVector();
for (int k = 0; k < btv.size(); k++) {
BindingTemplate bt = (BindingTemplate) btv.elementAt(k);
TModelInstanceDetails tmid = bt.getTModelInstanceDetails();
Vector tmidv = tmid.getTModelInstanceInfoVector();
for (int j = 0; j < tmidv.size(); j++) {
TModelInstanceInfo tmii =
(TModelInstanceInfo) tmidv.elementAt(j);
InstanceDetails id = tmii.getInstanceDetails();
if (id != null) {
OverviewDoc od = id.getOverviewDoc();
String oURL = od.getOverviewURLString();
// must remove port information
int p = oURL.indexOf('#');
wsdl.add(oURL.substring(0, p));
System.out.println(
"\tservice URL: " + oURL.substring(0, p));
}
}
}
wsdlURL = new String[wsdl.size()];
for (int k = 0; k < wsdl.size(); k++) {
wsdlURL[k] = (String) wsdl.elementAt(k);
}
} catch (Exception ex) {
throw new WSBusException(ex.getMessage());
}
return wsdlURL;
}
}
|
这个发现实现创建了一个总线
PortTypeFinderUDDI 实例。为了高效地查找那些服务,此类中的方法
findImplementations() 利用实践产生的构件,这些实践在 UDDI 注册中心内发布总线服务。基本上,这个方法只是搜索实现我们期望的 WSDL 端口类型的 UDDI
bindingTemplates ,在本例中,股票报价服务的端口类型部署在总线内。总线内实践的实现把服务实现 WSDL 的 URL 放入
overviewURL (在
bindingTemplate 的
tModelInstanceInfo 中)。发现实现累加这些 URL,然后返回这些 URL 以供选择机制使用。
为了使总线入站使用基于 UDDI 的发现实现,您必须使用配置文件覆盖样本实现。
清单 8 包含示例的配置文件,
wsbusClientUDS.cfg 。
清单 8. wsbusClientUDS.cfg
<busInfo namespaceURI="" started="true"
discoveryClass="services.demos.wsbus.client.selection.UDDIDiscovery"
selectionClass="services.demos.wsbus.client.selection.RandomSelection">
</busInfo>
|
配置文件建立上述基于 UDDI 的实现作为总线发现机制,同时把与 WSTK 安装在一起的随机选择实现作为总线选择机制;后者在给出的侯选者中做出随机选择。
为了测试基于 UDDI 的实现,请把
UDDIDiscovery.java 的类文件从本文的
代码包复制到
WSTK_HOME/services/demos/wsbus/client/selection 里,然后把配置文件
wsbusClientUDS.cfg 和批处理文件
uddiDiscoSQ.bat 从代码包中复制到
WSTK_HOME/services/demos/wsbus/client 。最后,执行
uddiDiscoSQ.bat 。您的输出应该看起来如
清单 9所示。
清单 9. 测试基于 UDDI 的实现:结果
C:\wstk-3.2.2\services\demos\wsbus\client>uddiDiscoSQ.bat
***
Invocation of a Stock Quote Service, UDDI discovery and random selection
***
Discovering and selecting a Stock Quote Service instance,
using WSIFServiceFactory
UDDI Discovery: finding services in UDDI!
FindTModel findPortTypeTModelKey() results: <?xml version="1.0" encoding="UTF-8"
?>
<tModelList generic="2.0" operator="operator" truncated="false" xmlns="urn:uddi-
org:api_v2">
<tModelInfos>
<tModelInfo tModelKey="UUID:389C138B-27FD-4E70-9AFD-0A3319622EC2">
<name>SQ</name>
</tModelInfo>
</tModelInfos>
</tModelList>
service URL: http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ3
service URL: http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ2
service URL: http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ1
Selecting #1
Retrieving document at 'http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ2'.
Retrieving import document at 'http://FLURRY:80/wstk/wsbus/ServiceInterface?name
=SQ2
Invoking the selected Stock Quote Service instance.
XXX = 255.25
|
看完
清单 9后,您会看到:
- 一种指示,表明总线入站使用的是 UDDI 发现实现。
- 一种确认,确认端口类型 tModel 存在于 UDDI 注册中心内
- 在 UDDI 注册中心搜索端口类型实现的结果,即是实现股票报价端口类型的三种总线服务的 WSDL URL
- 一种指示,表明随机选择机制选中的侯选者
- 调用被选中服务的结果。结果取决于选择的服务。
恢复您的 WSTK
您也许想要把您总线的配置恢复到运行本文中示例之前的状态 - 即恢复为没部署总线服务。您也许还想把示例中使用的 UDDI 注册中心的状态恢复 - 换而言之,就是删除各种 tModel、服务和其他您创建的构件。不幸的是,总线出站中的一个缺陷,使它不能成功地自动取消发布在 UDDI 注册中心的服务。在清除部署在总线中的股票报价服务之前,您
必须从 UDDI 注册中心手工删除服务(您可以使用 UDDI 注册中心 GUI 来做)。通常情况下,如果您使用总线取消服务的发布,总线(有时是 UDDI 注册中心)会挂起。
在您从 UDDI 注册中心删除服务之后,把文件
undeployForUDDI.xml 从文章的
代码包中复制到
WSTK_HOME/services/demos/wsbus/client/deployment 里,然后把批处理文件
undeployForUDDI.bat 从代码包中复制到
WSTK_HOME/services/demos/wsbus/client 。执行
undeployForUDDI.bat
;这从总线出站配置中就清除了部署的三种股票报价服务和 UDDI 注册中心。如果您希望这样做,您可以现在手工删除为运行示例而发布在 UDDI 注册中心内的 tModel 和业务了。
结束语
在这篇文章中,您学到了关于与 WSDL、UDDI 和总线发现有关的 Web 服务总线的许多方面的内容。特别是学到了怎样创建一个基于 UDDI 注册中心的发现机制,以及如何利用由总线实现的实践在 UDDI 注册中心高效地搜索实现一个特别的端口类型的服务。更加成熟的发现机制可以检查其他 UDDI 注册中心、WSIL 注册中心、数据库或其他实现端口类型的候选实现的源代码。同样,虽然样本代码是随机地选择服务,但更成熟的选择机制可以作出智能的选择,或许要根据成本或服务级别协议(SLA)条款(如果这些信息可用的话)进行选择。
最后的思考:虽然这个示例中的发现实现运行在客户机入站中,但类似的技术也可以运用在总线
服务器入站中。(要了解更多关于服务器入站的信息,请阅读 WSTK 附带的总线文档。)这将允许把总线服务器端配置成中介体,做有意思的事情,
类似于 Web Services Gateway(同样可以从 alphaWorks 获得)。(请参阅
参考资料。)
在这篇文章中,我解释了为什么可以利用 Web 服务总线的独特功能提供基于 UDDI 的机制,以便定位和调用 WSDL 端口类型的实现。在下一篇文章中,我将讨论
总线过滤器(bus filter),另一个 Web 服务总线功能,作为 Web 服务框架增强总线的功能。
参考资料
关于作者  | 
|  | Greg Flurry 是 IBM 的 Software Group Emerging Technologies 小组中的成员,这个组研究用于大范围电子商务环境的前沿技术。您可以通过
flurry@us.ibm.com与他联系。
|
对本文的评价
|