IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

为 WebSphere Enterprise Service Bus 开发自定义中介

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 中级

Nigel Daniels (daniels@uk.ibm.com), 软件工程师,WebSphere Platform Messaging, IBM

2006 年 10 月 19 日

本文介绍如何通过用于 WebSphere Enterprise Service Bus V6 的 WebSphere Integration Developer V6 环境来使用自定义中介。本文将演示简单场景中三种类型的自定义中介的开发。

引言

本文将介绍如何使用 IBM® WebSphere® Integration Developer V6.0.1 和 WebSphere Enterprise Service Bus V6.0.1(以下称为 WebSphere ESB)来开发自定义中介组件。文中将说明如何构造中介模块,并描述三种类型的自定义中介。

为了充分利用本文,您应该熟悉 Java™,并对 WebSphere Integration Developer 开发环境和 IBM Service Component Architecture (SCA) 有一定的了解。本文中的示例是使用 WebSphere Integration Developer 开发的,并在 WebSphere ESB 上进行部署。该示例也可以针对 WebSphere Process Server V6.0.1 编写,并在其中进行部署。

自定义中介基元允许业务集成器向中介流添加 Java 处理能力。尽管有三种方式构造自定义中介,但它们都具有相似的工作方式。自定义中介允许流从正在运行的流中调用包含该流的 SCA 组装中的 Java 组件:


图 1. 自定义中介的工作方式。
自定义中介的工作方式。

在图 1 中,组装图中的中介组件 (ProviderMediation) 包含该图下面部分中“放大的”流。中介组件建立对 Java 组件的引用,但通过引用来使用 Java 组件的是中介组件中的自定义中介基元。

正如所提到的,有三种创建自定义中介的方式:

  1. 具有用户创建的接口和实现的自定义中介。除非经过精心设计,否则这种类型的自定义中介可能具有一定的局限性。
  2. 具有完整的生成的接口和实现的自定义中介。这种类型的自定义中介允许使用 Snippet Editor 或 Visual Java Editor 在其最初的位置创建代码。
  3. 仅具有生成的接口的自定义中介。在这种类型的自定义中介中,必须使用标准的 Java 编辑器创建中介。

本文将说明如何在 DateProvider 项目中使用用户创建的中介。虽然此项目是外部服务,但在 DateService 项目中它仍将用作中介,并且此项目将演示另外两种类型的自定义中介的用法。

创建自定义中介

设置开发环境

要按照本文中的指导说明进行操作,需要确保对开发环境进行了正确的配置。在 WebSphere Integration Developer 中,首先选择 Window => Preferences 打开“Preferences” 对话框。

Workbench 设置

Workbench 区域中,选择 Capabilities 并确保所有的 Web Service Developer 选项被选中。对于开发自定义中介而言,并不需要这样做,但在对流进行测试时将使用 Web Services Explorer。

Server 设置

在 Preferences 的 Server 区域中,选择 Installed Runtimes 并确保 WebSphere ESB Server V6.0 是缺省的服务器。

JRE 设置

Java 区域中的 Installed JREs 中,确保缺省的 JRE 设置为使用 WebSphere ESB Server V6.0 JRE

Provider 项目

为了说明如何使用自定义中介,我们将演示如何生成各种类型的中介,从用户生成的版本开始。为了阐释这种形式的自定义中介,我们将创建接受基于 java.util.Date 的日期并以一个表示星期几的数值 (1=Sunday、2=Monday、......、7=Saturday) 作为响应的流。该项目通过以下步骤来完成:

  • 创建库
  • 创建组装
  • 创建流

创建库

在创建组装之前,需要创建一个 Library Project,用于存放要使用的接口。该接口将重用于后面的项目,因此需要一个共享的 Library Project。要创建它,请右键单击“Business Integration”视图并选择 New => Library。在 New Library 向导中,将 Name 设置为 DateLibrary 并单击 Finish

在创建了 DateLibrary 后,右键单击 DateLibraryInterfaces 区域并选择 New => Interface。在 New Interface 向导中,将 Name 设置为 DateProvider 并单击 Finish,这将生成新的接口并打开 Interface Editor。

在 Interface Editor 中创建一个名为 getDayOfWeek 的操作。对于该操作,设置一个名为 date 的日期类型的输入,以及一个名为 day 的整数类型的输出。最后的结果应该如图 2 所示:


图 2. Date Provider 接口。
Date Provider 接口。

创建组装

要创建组装,请右键单击“Business Integration”视图并选择 New => Mediation Module。在“New Mediation Module”向导中,将模块 Name 设置为 DateProvider,保留其他的缺省设置不变,单击 Next>。在向导的下一个面板中,可以选择模块所引用的库。在本例中,需要能够引用刚创建的 DateProvider 接口。选中 DateLibrary 旁边的复选框并单击 Finish,这将创建一个新的中介模块。

双击组装图并将中介组件由 Mediation1 重命名为 ProviderMediation。然后向组件添加 DateProvider 接口。添加一个 Export 组件并将其命名为 ProviderExport,然后再次添加 DateProvider 接口。再次右键单击它并将导出绑定设置为 SCA 绑定。现在,从托盘中选择一个 Java 组件并将之添加到画布中,然后再次向组件添加 DateProvider 接口。这时对话框中还将显示出 Java 类,因此将视图筛选为 Web Service Description Language (WSDL) 文件。将组件由 Component1 重命名为 ProviderComponent

最后选择连接工具,并将 ProviderExport 连接到 ProviderMediation 以及 ProviderMediation 连接到 ProviderComponent。将出现一个对话框询问 A matching reference will be created on the source node. Do you want to continue?。单击 OK。在创建连接后,ProviderMediation 中会出现一个标注为 1..1 的框。该框表示对于中介组件而言,对 Java 组件的引用是可用的。最后得到的组装应该如下所示:


图 3. Date Provider 组装。
Date Provider 组装。

保存到目前为止创建的组装。ProviderMediationProviderComponent 上的包含感叹号的蓝色圆圈表示流和 Java 组件需要实现。

创建 Java 组件

要创建 ProviderComponent 背后的实现,请双击该组件。当被问到 Would you like to implement the component now? 时,单击 Yes。下一个对话框中有一个为将生成的 Java 代码创建包的选项。单击 New Package,并在 New Package 对话框中将包名称设置为 com.ibm.dateprovider。回到 Generate Implementation 对话框后,选择新的包并单击 OK

所生成的 DateProviderImpl 类将在 Java Editor 中打开。该类比较简单,并由 Java 组件进行引用。其中的注释解释了这些方法的作用。这里有一个方法需要进行修改:


清单 1. Date Provider 方法
/**
 * Method generated to support implementation of operation
 * "getDayOfWeek" defined for WSDL port type named
 * "interface.DateProvider".
 *
 * Please refer to the WSDL Definition for more information
 * on the type of input, output and faults).
 */
public Integer getDayOfWeek(Object date) {
	//TODO Needs to be implemented.
	return null;
}

用清单 2 中的代码替换 getDayOfWeek 方法的内容:


清单 2. Date Provider 代码
System.out.println("ProviderComponentImpl - getDayOfWeek : Mediation Called");

// Use a GregorianCalendar to get the day of the week
System.out.println("ProviderComponentImpl - getDayOfWeek : 
		Setting GregorianCalendar to using date[" + ((Date)date) + "]");
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime((Date) date);

System.out.println("ProviderComponentImpl - getDayOfWeek : 
		Setting calendar is [" + calendar + "]");

//Return the day of the week
System.out.println("ProviderComponentImpl - getDayOfWeek : Returning the day of week as "
                    + calendar.get(java.util.Calendar.DAY_OF_WEEK));
return new Integer(calendar.get(java.util.Calendar.DAY_OF_WEEK));

在保存并关闭 Java Editor 后,Java 组件将不再被标注为需要实现。

创建流

双击 ProviderMediation 流组件。当被问到 The selected component is not yet implemented. Would you like to implement the component now? 时,单击 Yes。下一个对话框会询问在何处生成实现。单击 OK 以接受 DateProvider 项目根目录的缺省位置。

这时将打开 Mediation Flow Editor。它有两个窗格,其中下面的窗格具有属性视图并起着重要的作用。上面的窗格显示出正在进行的接口操作,而下面的窗格则显示了与该操作关联的流。我们将为 DateProvider 接口上的单个操作创建简单的请求/响应流。选择 getDayOfWeek 操作,下面的 Request 窗格将显示出两个可用的节点——该操作的 Input 节点和 Input Response 节点。因为我们并没有将操作与外部服务关联起来,所以不会看到任何所要连接的 Callout 节点。考虑到我们的目的,这正是我们所需要的,因为我们在把传入的消息传递到自定义中介后,将“循环回到”任何传入的消息。

要将自定义中介添加到画布,请从流托盘中选择自定义中介并单击空白画布。将自定义中介由 CustomMediation1 重命名为 ProviderMediation。选择 Input 节点的 Out 终端并将其连接到 ProviderMediation 的 In 终端。然后将 ProviderMediation 的 Out 连接到 Input Response 节点的 In。最后得到的流应该如下所示:


图 4. Date Provider 流。
Date Provider 流。

下一步,将 ProviderMediation 与我们先前创建的接口关联起来,该接口将组装图中的 Java 组件连接到我们正在创建的自定义中介。选择 ProviderMediation,并在下面的属性视图中选择 Details 选项卡:


图 5. 自定义中介 properties - Details。
自定义中介 properties - Details。

当生成自定义中介并基于用户提供的流建立它时,Custom Mediation Wizard 假设请求是输入消息,而响应是输出消息。因此,直接将这类自定义中介用于请求/响应流是最简单的,其中在导出上使用了相同的接口。

如果这是响应流,则将选择请求消息作为输入,并将响应消息设置为输出,但是周围的节点只需要响应消息。对于请求消息而言,反之亦然。通过精心设计接口并在可能的情况下使用 XSLT Mediation Primitives,可以解决这个问题。当嵌入在复杂流中时,该问题可能并不是一个难题。

Details 选项卡显示了错误 Service operation: cannot be empty。要更正这个错误,单击 Define 打开 Define Custom Mediation 对话框,在第一个面板中,设置 Choose an existing interface 选项,这样可以设置已创建的接口。单击 Next>,然后单击 Browse 以选择 DateProvider 接口。然后选择 Operation 下拉列表以选择 getDayOfWeek 操作。Input MessageOutput Message 的显示自动地设置为该操作上的请求和响应消息。单击 Finish

因为我们已经定义了自定义中介及其接口,所以流已经完成。保存该流。现在组装也已经完成。

Service 项目

我们刚生成的中介模块接受日期作为输入,并用表示该日期为星期几的数值做出响应。现在让我们将这个“服务”放入到使用自定义中介的通用上下文中。假设 Web 客户端打算使用该服务并从一个用户获得独立日、月和年格式的日期信息。所需的响应将是表示星期几的字符串:


图 6. 消息不匹配。
消息不匹配。

为了解决上面的场景中的消息类型不匹配问题,可以使用 WebSphere ESB 和自定义中介。要实现该项目,需要执行以下步骤:

  • 创建接口
  • 创建组装
  • 映射操作
  • 创建请求流
  • 创建响应流
  • 创建组件

创建接口

需要做的第一件事情是创建一个自定义中介项目。 将其命名为 DateService,并再次确保它具有对 DateLibrary 的引用,因为其中包括了我们将要调用的接口。 在生成该项目后,创建一个 Business Object 数据类型以保存输入的日、月和年。 右键单击 DateService 项目的 Data Types 部分并选择 New => Business Object。 在 New Business Object Wizard 中,将名称设置为 DateBO 并单击 Finish。 Business Object Editor 将打开并显示 DateBO 对象。 选择 Add as attribute to a business object 图标并添加第一项属性。系统将会创建一项新的属性。将名称由 attribute1 更改为 day 并将其类型设置为 int。重复该过程并添加 monthyear 属性。最后的 Business Object 应该如下所示:


图 7. DateBO Business 对象。
DateBO Business 对象。

因为已经创建了用来保存输入数据的 Business 对象,接下来生成 DateService 将使用的接口:


图 8. Date Service 接口。
Date Service 接口。

创建组装

现在所有的部分已就位,可以开始创建 DateService 组装了。需要完成下面两个阶段,在第一个阶段中,我们将创建图 9 所示的基本组装。以后将生成所需的 Java 组件。双击 DateService 组装以在 Assembly Editor 中打开它。将 Mediation 组件重命名为 ServiceMediation,并为其分配 DateService 接口。然后将 Import 和 Export 组件添加到画布,并将它们分别命名为 ServiceImportServiceExport

从 Import 开始,需要将其配置为引用 DateProvider 项目中创建的 ProviderExport。首先,从共享库中为该组件分配 DateProvider 接口,并将组件的绑定设置为 SCA Binding。因为该组件与我们所希望的目标 Export 具有相同的绑定类型,所以右键单击组件并选择 Select Service To Import。在 SCA Export Selection 对话框中,选择 ProviderExport。该导入现在将引用我们先前创建的导出,并最终让我们在模块中使用自定义中介,因而使用 DateProvider 作为外部服务的替代。在实际情况中,可能不会将接口导入到外部服务(如现有的 Web 服务或 JMS 应用程序)。

画布中下一个需要编辑的项是导出。为组件分配 DateService 接口。然后为导出分配 Web Service Binding。在对问题 Should we automatically generate a WSDL file with binding/service/port elements defined inside for you? 的回答中,单击 Yes。在 Select Transport 对话框中,选择 SOAP/HTTP 作为传输方式。在作为客户来使用 Web Service Explorer 测试文件时,这是必需的。请注意 DateService 项目中出现的 Web Service Ports 部分。该部分现在应该包括 ServiceExport_DateServiceHttpPort 文件。

最后的任务是连接组装。将导出连接到中介组件,并将中介组件连接到导入。当被问到关于接口和引用的问题时,单击 OK。完成这些任务后,请记住选择托盘上的 Selection 工具以退出连接模式。保存该文件,它应该如下所示:


图 9. 服务组装的创建——阶段一。
服务组装的创建——阶段一。

映射操作

在创建了组装后,我们已将不兼容的接口连接到一起。在中介组件中,我们将在请求和响应流中使用中介组件来转换消息。在组装图中,双击 ServiceMediation 并打开 Flow Editor。此时,首先要做的是关联 getDay 操作与 DateProviderPartner 引用的 getDayOfWeek 操作。要完成该任务,将鼠标移动到 getDay 操作上,选择 Create Operation Mapping 句柄,并将之拖至 DateProviderPartner 引用的 getDayOfWeek 操作上。这将产生一个表示映射的箭头,如图 10 所示:


图 10. 服务流操作映射。
服务流操作映射。

请注意在 Flow Editor 中发生的两件事情:

  1. 在画布上,出现了 DateProviderPartner_getDayOfWeek_Callout 调用。
  2. 出现了第二个 Response :getDay 选项卡。

继续之前请先保存该流。

创建请求流

让我们从请求流开始。将由中介来执行从输入消息(日、月、年)到我们将调用的服务所需的输入消息 (java.lang.Date) 的转换。请确保选中 Request:getDay 选项卡,并向画布添加名为 RequestMediation 的自定义中介。将 DateService_getDay_Input 连接到 RequestMediation,然后将 RequestMediation 连接到 DateProviderPartner_getDayOfWeek_Callout。传入的消息在其旅程的请求部分中将经过自定义中介,然后传递给 DateProviderPartner 的输入,而 DateProviderPartner 是在组装图中要导入的引用。最后得到的流应该如下所示:


图 11. 服务流——Request :getDay。
服务流——Request :getDay。

忽略输入响应节点 (DateService_getDay_InputResponse) 上的警告标记,它仅仅只是警告节点终端尚未连接。在本例中,我们希望消息传递到下一个模块,而不是直接由这个流返回。

因为对流进行了配置,我们可以构建流的内容。选择 RequestMediation,然后在中介的 Properties 视图中,选择 Details 选项卡并单击 Define

此时,保持 Create a new interface with implementation 处于选中状态并单击 Next>。在下面的面板中,不需要更改任何内容。输入 getDayRequestMsg 和输出 getDayOfWeekRequestMsg 中的请求消息是我们需要进行转换的消息。在下一个面板中,将 NameCustomMediation1 更改为 RequestMediation,并单击 Next>。最后,选择 Generate a default Java implementation class and define it using the embedded visual snippet editor 并单击 Finish。在对话框关闭后,Mediation Flow Editor 的 Operation connections 面板中将出现一项带有 mediate 操作的 RequestMediationPatner 引用。同时,Business Integration 视图中 DateService 项目的 Interfaces 区域中将出现 RequestMediation 接口。

完成了对将要使用的接口的设置,我们需要将 Java 代码添加到 Java Snippet。选择 Properties 视图的 Implementation 选项卡,如下面的图 12 所示。通过使用 Java Snippet Editor,这种形式的中介从概念上 指示出 Java 代码的驻留位置,即使代码驻留在 Java 组件中。Snippet Editor 有一些值得注意的限制。它不会指示出 Java 代码中的错误,并且在添加需要导入的代码时,请不要忘记按 Ctrl+Shift+O 来组织导入或完全限定所包含的类。

在编辑代码时,如果需要对所发生的情况进行更好的查看,请单击 Open Java Editor 以访问包含该代码的类。


图 12. 自定义中介 Properties -- Implementation。
自定义中介 Properties -- Implementation。

在代码段中,将清单 3 中的代码添加到代码段部分:


清单 3. Java Snippet 代码
System.out.println("RequestMediation : Mediation called");
System.out.println("RequestMediation : Getting BOFactory");
ServiceManager serviceManager = ServiceManager.INSTANCE;
BOFactory bofactory = 
(BOFactory) serviceManager.locateService("com/ibm/websphere/bo/BOFactory");

System.out.println("RequestMediation : Getting dateBO");
DataObject dateBO = a_type.getDataObject("dateBO");

System.out.println("RequestMediation : Create date from [" + dateBO.getInt("year") + ", "
                                                           + dateBO.getInt("month")+ ", "
                                                           + dateBO.getInt("day") + "]");
GregorianCalendar calendar = new GregorianCalendar(dateBO.getInt("year"),
                                                   dateBO.getInt("month")-1,
                                                   dateBO.getInt("day"));

System.out.println("RequestMediation : Create DataObject
                    http://DateLibrary/DateProvider/getDayOfWeek");
DataObject getDayOfWeek = bofactory.createByElement("http://DateLibrary/DateProvider",
                                                    "getDayOfWeek");

System.out.println("RequestMediation : Set getDayOfWeek date attribute");
getDayOfWeek.setDate("date", calendar.getTime());

System.out.println("RequestMediation : Return date getDayOfWeek");
return getDayOfWeek;

如果输入的代码不能持久,换句话说,在返回到 Snippet Editor 中后,仅看到 return null; 而不是复制粘贴的代码,那么可以将代码直接添加到包含 Java 代码段的类中。不通过 Open Java Editor 按钮来访问代码,需要直接定位到代码的实际驻留位置。要做到这点,请切换到 Java Perspective 并查找 DateService 项目。在其中,找到包
sca.component.mediation.java.impl

在这个包中有两个类,
RequestMediationPartner.java
RequestMediationPatnerCustomLogic.java,其中的第二个类包含一个名为 JavaSnippet 的内部类,我们在 Java Snippet Editor 中更改的代码就驻留于这个内部类中。在这个内部类中,定位到 public DataObject execute(DataObject a_type) 方法,并将其粘贴到上面的代码中。然后按 Ctrl+Shift+O 以组织导入并保存文件。然后返回到 Business Integration Perspective 并继续。这一次,代码将持久保持。

在此处,保存到目前为止创建的流。我们正在工作的项目上会出现一个错误标记。出了什么错误呢?通过消息 "The mediation flow implementation 'ServiceMediation.mfc' contains a reference 'ResponseMediationPartner' that does not match a corresponding reference in the mediation flow component." 将该错误和组装图关联起来。

回忆一下,引言中描述了在流的自定义中介中使用对组装图中流外部组件调用的引用。在本练习的第一部分中,我们生成了一个 Java 组件并将其连接到自定义中介以创建一个引用。在这种情况下,我们已生成了自定义中介、Java 代码和引用。然而,引用所查找的组件在组装图中尚不存在。可以暂时忽略这个错误,因为我们将在练习中的最后一个阶段中改正它。

创建响应流

下一步,填充中介流的另一半。这个转换的任务是接受来自“外部”服务的响应消息(表示星期几的 int),并将之转换为我们自己的接口所需要的响应(java.lang.String 版本的星期几)。这一次,选择 Mediation Flow Editor 中的 Response :getDay 选项卡,并和前面所做的一样,添加自定义中介。将中介命名为 ResponseMediation,并将其连接到流中。最后得到的流应该如下所示:


图 13. 服务流——Response :getDay。
服务流——Response :getDay。

ResponseMediation 的属性视图中,转到 Details 选项卡并单击 Define。再次选择 Create a new interface with implementation => Next>。单击下面的面板,并在下一个面板中将 NameCustomMediation1 更改为 ResponseMediation,然后单击 Next>。在最后的面板中,选择 Specify the implementation manually as Java component or Import in the Assembly Editor -- default Java Implementation will not be generated 并单击 Finish

Mediation Flow Editor 的 Operation connections 面板中将出现 ResponseMediationPartner,并在项目中生成关联的 ResponseMediation 接口。保存该流。您可能注意到出现了另一个错误,它与以前在请求流中出现的错误类似。现在是修复这些错误的时候了。

创建 Java 组件

打开组装图并右键单击 ServiceMediation,选择 Merge Implementation。将会被问到 Do you want to merge the new implementation with the existing one?。单击 OK。这时将打开一个对话框显示出正在使用的引用,其中的一个复选框表示将会创建一个 Java 组件。再次单击 OK,这样将切换回 Flow Diagram。返回到 Assembly Diagram Editor,应该可以看到两个新的组件。单击 Arrange Contents Automatically,关系图应该如下所示:


图 14. 服务组装创建——阶段二。
服务组装创建——阶段二。

我们所创建的中介将从流中调用这两个 Java 组件。ResponseMediationPatner 被标记为需要实现。回忆一下在创建流的过程中,我们曾将代码添加到请求流。如果代码在持久上有问题,那么看到的是该 Java 组件实现的驻留之处。

要实现 ResponseMediationPartner,请按照与实现 ProviderComponent 时相同的步骤进行,但这次将包设置为 com.ibm.dateservice,并将清单 4 中的代码添加到 public DataObject mediate(DataObject a_type) 方法:


清单 4. Response mediation partner 代码
System.out.println("ResponseComponentImpl - mediate : Mediation Called");
StringBuffer dayOfWeek = new StringBuffer();

System.out.println("ResponseComponentImpl - mediate : Getting the day number");
int day = a_type.getInt("day");

//Decide which day of the week it is
System.out.println("ResponseComponentImpl - mediate : 
					Decide day of week on value [" + day + "]");
switch (day) {
    case 1: {
        dayOfWeek.append("Sunday");
        break;}
    case 2: {
        dayOfWeek.append("Monday");
        break;}
    case 3: {
        dayOfWeek.append("Tuesday");
        break;}
    case 4: {
        dayOfWeek.append("Wednesday");
        break;}
    case 5: {
        dayOfWeek.append("Thursday");
        break;}
    case 6: {
        dayOfWeek.append("Friday");
        break;}
    case 7: {
        dayOfWeek.append("Saturday");
        break;}
    default : {
        dayOfWeek.append("Day could not be calculated");
        break;}
    }

System.out.println("ResponseComponentImpl - mediate : Getting BOFactory");
ServiceManager serviceManager = ServiceManager.INSTANCE;
BOFactory bofactory = 
(BOFactory) serviceManager.locateService("com/ibm/websphere/bo/BOFactory");

System.out.println("ResponseComponentImpl - mediate : Create DataObject
                    http://DateService/DateService/getDayOfWeek");
DataObject getDay = bofactory.createByElement("http://DateService/DateService",
                                              "getDayResponse");

System.out.println("ResponseComponentImpl - mediate : Set dayOfWeek string to ["
                    + dayOfWeek.toString() + "]");
getDay.setString("dayOfWeek", dayOfWeek.toString());

System.out.println("ResponseComponentImpl - mediate : Returning getDay");
return getDay;

保存刚刚添加的 Java 代码,返回到 Assembly Diagram Editor 中并再次进行保存。实现标记将会消失。中介流已经完成,现在可以部署该流并使用 Web Services Explorer 对其进行测试。

测试流

首先,转到 Business Integration Perspective 中的 Servers 视图。如果尚未创建服务器,请右键单击视图窗格并选择 New => Server。在 New Server 对话框中,选择 WebSphere ESB Server V6.0 并单击 Finish。Servers 视图中将出现 WebSphere ESB Server V6.0 localhost。如果目标服务器是远程的,那么它将显示 localhost 以外的信息。选择新服务器并确保它已经启动。这可能需要一段时间,但最后将在 Console 视图中看到:

[31/12/05 16:26:08:109 GMT] 0000000a WsServerImpl  A  WSVR0001I: 
Server server1 open for e-business

在 Server 视图中,服务器应该处于“started”状态:


图 15. 已启动服务器。
已启动服务器。

回到 Servers 视图并选择 ESB 服务器。双击服务器并选择 Add and remove projects,它将会出现一个显示已经部署和可以进行部署项目的视图的对话框。确保 DateProviderDateService 项目已添加到服务器。单击 Finish

一旦项目发布到服务器上,就可以对它们进行测试了。切换至 Java Perspective。回忆一下在我们为 DateService 项目创建导出的时候,我们创建了绑定到导出的 Web 服务并将其设置为使用 SOAP/HTTP 传输方式。在完成这项工作后,将为我们生成一个 WSDL 文件,其中已经定义了所有的绑定、服务和端口。我们将在 Web Service Explorer 中使用这个 WSDL 文件来测试我们刚刚部署的流。

在 Java Perspective 中,使用 Package Explorer 来定位 DateService 项目。在这个项目的根中,找到我们将用来做测试的 ServiceExport_DateServiceHttp_Service.wsdl 文件。右键单击 WSDL 文件并选择 Web Services => Test with Web Services Explorer。将打开 Web Service Explorer 浏览器并会看到我们选择的文件。在操作部分中,单击 getDay 链接以转到 Invoke a WSDL Operation 页面。在这里可以看到 dateBO 中的每一个部分,包括 daymonthyear。对于其中的每个部分,选择 Add 并输入适当的值,比如 day=1、month=1、year=1970。然后单击 Go,它将把日期数据发送到部署了该流的服务器。在对这些数据进行处理后,下面的 Status 面板将会发生变化并显示 getDayResponse 消息和 dayOfWeek 的值。例如给定上述的日期,那么响应将会是 Thursday


图 16. Web Services Explorer。
Web Services Explorer。

作为流运行过程进一步的证据,在控制台中将会看到来自我们添加的 Java 代码中 System.out.println(); 行的输出。这些内容允许我们看到不同处理阶段中的消息:


清单 5. 控制台输出
[29/12/05 17:14:44:688 GMT] 00000051 SystemOut     O RequestMediation : Mediation called
[29/12/05 17:14:44:688 GMT] 00000051 SystemOut     O RequestMediation : Getting BOFactory
[29/12/05 17:14:44:703 GMT] 00000051 SystemOut     O RequestMediation : Getting dateBO
[29/12/05 17:14:44:703 GMT] 00000051 SystemOut     
							O RequestMediation : Create date from [1970, 1, 1]
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
[29/12/05 17:14:44:703 GMT] 00000051 SystemOut     O RequestMediation : Create DataObject
                            http://DateLibrary/DateProvider/getDayOfWeek
[29/12/05 17:14:44:703 GMT] 00000051 SystemOut     
							O RequestMediation : Set getDayOfWeek date attribute
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
[29/12/05 17:14:44:703 GMT] 00000051 SystemOut     
							O RequestMediation : Return date getDayOfWeek
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
[29/12/05 17:14:45:156 GMT] 00000051 SystemOut     
							O ProviderComponentImpl - getDayOfWeek : Mediation Called
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
[29/12/05 17:14:45:156 GMT] 00000051 SystemOut     
							O ProviderComponentImpl - getDayOfWeek :
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
                            Setting GregorianCalendar to using date
                            [Thu Jan 01 00:00:00 GMT 1970]
[29/12/05 17:14:45:156 GMT] 00000051 SystemOut     
							O ProviderComponentImpl - getDayOfWeek :
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
                                                     Setting calendar is
                                                     [java.util.GregorianCalendar
                                                     [time=-3600000,
                                                     areFieldsSet=true,
                                                     areAllFieldsSet=true,
                                                     ...
                                                     MILLISECOND=0,
                                                     ZONE_OFFSET=3600000,
                                                     DST_OFFSET=0]]
[29/12/05 17:14:45:156 GMT] 00000051 SystemOut     
							O ProviderComponentImpl - getDayOfWeek :
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
                                                     Returning the day of week as 5
[29/12/05 17:14:45:188 GMT] 00000051 SystemOut     O ResponseComponentImpl - mediate :
                                                     Mediation Called
[29/12/05 17:14:45:188 GMT] 00000051 SystemOut     O ResponseComponentImpl - mediate :
                                                     Getting the day number
[29/12/05 17:14:45:188 GMT] 00000051 SystemOut     O ResponseComponentImpl - mediate :
                                                     Decide day of week on value [5]
[29/12/05 17:14:45:188 GMT] 00000051 SystemOut     O ResponseComponentImpl - mediate :
                                                     Getting BOFactory
[29/12/05 17:14:45:188 GMT] 00000051 SystemOut     O ResponseComponentImpl - mediate :
                            Create DataObject
                            http://DateService/DateService/getDayOfWeek
[29/12/05 17:14:45:188 GMT] 00000051 SystemOut     O ResponseComponentImpl - mediate :
                                                     Set dayOfWeek string to [Thursday]
[29/12/05 17:14:45:188 GMT] 00000051 SystemOut     O ResponseComponentImpl - mediate :
                                                     Returning getDay

结束语

WebSphere ESB Server V6.0.1 附带了一个好的中介基元的基本托盘并具有易于使用的界面,使用该界面,可以快速集成不同的接口。然而,总有一些应用程序或接口无法像我们想象的那样很好地配合。本文介绍了自定义中介如何允许 Business Integrator 添加 Java 代码来处理这些情况。通过创建接口不能很好地匹配的示例,我们演示了使用自定义中介可以如何快速而方便地解决这个问题。

希望本文有助于您了解自定义中介强大的功能。除了这里描述的情形外,自定义中介还允许添加代码对消息进行多种操作,并在必要时添加业务逻辑。例如,可以使用它们来调用复杂的 JDBC 查询、生成新的消息或以 XSLT 无法实现的方式来操作消息体或消息头。随着需要解决的实际问题的不同,解决方案也可能有所不同。






回页首


下载

描述名字大小下载方法
Code samples in zip formatCustomMediations.zip269 KB  FTP|HTTP
关于下载方法的信息


参考资料



关于作者

Nigel Daniels 的照片

Nigel Daniels 是英国 IBM Hursley Software Lab 的一位高级软件工程师,并且是 WebSphere ESB 功能性测试的团队负责人。在 2003 年加入 IBM Hursley 之前,他已具有超过 10 年的广泛 IT 行业经验。他的专长包括面向对象 (OO) 设计和产品及应用程序的开发、Eclipse 和 Java 开发,以及软件测试。他是一名认证软件测试师,并拥有英国布瑞顿大学 (Brighton University) 面向对象的软件技术硕士学位。您可以通过 ndaniels@uk.ibm.com 与 Nigel 联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款