使用 WebSphere ESB 构建企业服务总线,第 2 部分
 

2009-07-07 作者:Rachel Reinitz,Andre Tost 来源:IBM

 
本文内容包括:
第 1 部分介绍了 IBM® WebSphere® Enterprise Service Bus (ESB) 提供的用于构建 ESB 的关键功能,其中使用了一个贯穿本系列的示例业务上下文,还阐述了 WebSphere Application Server 的 SIBus 功能与 WebSphere ESB 之间的关系。第 2 部分演示如何将 J2EE™ 客户机应用程序连接到 ESB,即通过 JMS 发送消息,让 ESB 记录消息,然后将其路由到消息驱动的 Bean (MDB) 实现的服务提供程序。因此,本文将演示用于 JMS 服务请求程序和 JMS 服务提供程序的 ESB 支持。

引言

我们首先通过一个示例开始了最初的 WebSphere Application Server ESB 系列文章,介绍系统集成总线 (SIBus) 如何作为应用服务器的缺省 JMS 提供程序。第一篇文章介绍了如何连接 J2EE 应用程序客户机:将一个普通的 JMS 文本消息发送到在实现为消息驱动的 Bean (MDB) 应用服务器上运行的 JMS 服务提供程序。在本文中,我们将使用相同的示例作为开篇,但这次不是将消息从客户机发送到 SIBus 队列,然后 MDB 服务从该队列获取消息,而是通过在 WebSphere ESB 中运行的中介来路由消息。

为将此示例放在业务上下文中,我们将使用第 1 部分中包括的运输公司场景。我们将假设每当向客户机交付数据包时,必须向主系统发送一条消息来确认交付。此确认消息是同步发送的;也就是说,不需要对消息进行响应,只需将消息排队等待主系统进行处理。

增强的体系结构

ESB 通过提供虚拟服务接口能够构建分离的系统,这意味着客户机不直接访问实际服务提供程序,而是与 ESB 交换消息。ESB 然后在实际服务提供程序之间来回路由消息。这不但对 Web 服务是这样(即服务通过 SOAP/HTTP 绑定公开),而且对任何服务都是这样。在我们的示例中,我们让 J2EE 应用程序从 JMS 队列接收普通文本消息。在 ESB 的上下文中,我们作为一个服务提供程序来查看此应用程序。类似地,我们向 JMS 客户机应用程序提供服务接口。

我们将不花费太多的时间来说明用于此示例的服务请求程序和提供程序代码(这些代码实际上与任何典型的 JMS 代码没有任何区别;有关 JMS 教程,请参见参考资料),但我们先回顾以下基本内容:

  • J2EE 客户机应用程序仅发送包含交付的数据包数量的消息。
  • 因为此发送程序代码运行于 J2EE 客户机应用程序,我们没有硬编码已使用的 JMS 资源的名称,而是使用 java:comp/env 命名空间。两个名称(一个用于连接工厂,另一个用于实际队列)都使用客户机应用程序部署描述符中的资源引用进行绑定。
  • 客户机最初编写为发送简单的文本消息,但将被更新为发送 XML 消息。
  • 对于 MDB,情况就更为简单:每个 MDB 都有一个名为 onMessage() 的方法,消息一旦到达 MDB 侦听的队列就会调用该方法,然后会将此消息打印到 System.out。

一个有趣的方面是通过 WebSphere ESB 进行路由,现在我们已经分离了客户机 JMS 配置和 MDB 配置——将把它们都配置为与 WebSphere ESB 通信。如果将 MDB 部署在不同的服务器上,则不需要更改客户机应用程序。由于消息流经 WebSphere ESB,因此可以在 ESB 中进行中转。

图 1 显示了与本文将要绑定的内容相比,JMS 请求程序和 MDB 直接通过 SIBus 队列进行连接时的步骤(在前一篇系列文章的第 3 部分进行了描述)。

图 1. 示例场景步骤
图 1. 示例场景步骤

在更新的体系结构中,注意我们使用了两个队列:一个在客户机和 WebSphere ESB 中介之间,另一个在中介和实际接收程序(即服务提供程序)之间。图 1 还显示了 WebSphere ESB 构件仍在 WebSphere Application Server 中运行的方式,后者提供 JMS 运行时和承载消息驱动的 Bean。为简便起见,我们在与 WebSphere ESB 相同的服务器上运行 MDB;在生产环境中,MDB 一般将运行在请求附加配置步骤的单独服务器上。

WebSphere ESB 中的中介流组件只是服务组件体系结构 (SCA) 中定义的另一种类型的服务组件。SCA 需要一个描述总线上服务端点的服务接口定义(客户机应用程序将调用的接口)。提供一个正式的 (WSDL) 描述可让我们作为服务调用来查看 JMS 消息交换。(有关 SCA 的信息,请参见参考资料。)

ESB 创建和配置概述

在开始之前,我们在下面概述将在本文中执行的步骤。(若要将需要执行的工作减到最少,可以使用本文中包括的下载资料,其中提供了用于服务请求程序和服务提供程序的 EAR,一个包含完整的 WebSphere ESB 中介的项目交换文件。如果选择使用项目交换文件,您仍需要配置客户机和 MDB 应用程序的部署描述符以及服务器本身。)

  1. 创建 WebSphere ESB 服务器。
  2. 创建服务接口。您需要使用 WebSphere Integration Developer 创建服务接口的 WSDL 描述,以便服务请求程序将消息发送到总线,并由 MDB 作为服务提供程序进行接收。
  3. 创建中介。您需要创建中介模块和构建中介流组件。中介导出和导入都需要配置上面第 2 步中创建的服务接口。需要为导出和导入创建 JMS 绑定。中介可以很方便地记录流经它的消息。
  4. 设置服务请求程序。您需要修改发送简单文本字符串的初始测试客户机,使其发送 XML 消息。您需要设置客户机应用程序和 WebSphere Application Server 的 JMS 配置,指定 WebSphere ESB 在哪个程序上运行以及客户机连接到哪个程序。WebSphere ESB 生成的 SIBus 队列将用作配置的一部分。
  5. 设置服务提供程序。您需要使用 WebSphere ESB 生成的 SIBus 队列修改 MDB EAR 配置。
  6. 运行端到端测试。

版本

使用 WebSphere Integration Developer 和 WebSphere Enterprise Service Bus 的最新可用版本。在撰写本文时,我们使用了 WebSphere Integration Developer V6.0.1.2 和 WebSphere ESB V6.0.1.2。在 2006 年 12 月底将推出一个修复程序包,该程序包可以将这两个产品升级到 6.0.2 版本,升级后的程序将在功能和性能上有明显的增强,因此在可用时请使用这些版本。

A. 创建 WebSphere ESB 服务器

在 WebSphere Integration Developer 中创建一个用于进行测试的测试服务器。

  1. 在 WebSphere Integration Developer 的 Servers 面板上,选择 New => Server
  2. 选择 WebSphere ESB Server v6.0,接受缺省值,然后单击 Finish

如果您已经创建了测试服务器,则可以重用它,不过请注意,这样的测试服务器上可能有预先存在的构件,它们可能造成冲突。

B. 创建服务接口

服务组件通过导入和导出与外部合作伙伴交互。在我们的示例中,导出操作与 JMS 客户机应用程序交互,导入操作与 MDB 交互。

图 2. 中介的 SCA 组装
图 2. 中介的 SCA 组装

导出和导入都需要一个接口定义来描述交换数据的确切格式。而且都使用一个绑定来描述发送数据所使用的基本协议的细节。在此示例中,导入和导出接口是相同的。

我们首先从接口开始讲起。在最初的示例中,我们只是发送一个字符串(“package received”通知)。在更新的版本中,我们需要通过定义一个包含消息结构定义的 XML 模式来设置该字符串的标准格式。这可以在中介和最终接收程序中更方便地处理该消息。我们将在 WebSphere Integration Developer 中使用业务对象编辑器和接口编辑器来创建接口。业务对象编辑器用于描述消息的内容,接口编辑器用于描述如何将消息包装到操作信封中。这些图形工具将生成描述接口的模式和 WSDL,并可以将它们提供给服务请求程序和提供程序。

  1. 在 Business Integration 视图中打开 WebSphere Integration Developer。
  2. 创建一个名为 PackageReceivedModule 的新中介模块。中介模块用作中介组件及其包含逻辑的容器,并可以在封装的情况下映射到可部署的 EAR 项目。
  3. 在导航树中通过选择 Data Types 节点打开业务对象编辑器。右键单击编辑器,创建一个新的业务对象。
  4. 在新建业务对象向导中,将业务对象命名为 PackageReceivedBO,并对所有字段保留缺省值。单击 Finish
  5. 在业务对象编辑器打开时,向业务对象添加一个名为 message 的属性,并将其类型指定为 string。最终定义将如图 3 所示。
    图 3. 业务对象定义
    图 3. 业务对象定义

    此消息属性将在消息流经 WebSphere ESB 时存储该消息的有效负载。另外,业务对象定义作为 XML 模式存储在 .xsd 文件中。您可以在任何 XML 模式编辑器中进一步修改它。不过,对于本文而言不需要这样做。

  6. 保存更改。
  7. 现在您已经准备好创建实际的服务接口。在导航树中右键单击 Interfaces 节点,并选择 Create a new Interface
  8. 将新接口命名为 PackageReceivedIF,并对其余所有选项保留缺省值。单击 Finish。此时会打开接口编辑器。
  9. 在接口编辑器中,选择 Add One Way Operation 并将其称为 package_received
  10. 添加输入参数,并将其命名为 packageReceivedBO,将业务对象类型指定为 PackageReceivedBO(浏览到您在上面创建的此类型)。现在此接口应该与图 4 所示类似。
    图 4. 接口定义
    图 4. 接口定义
     
  11. 保存更改。

要查看生成的 WSDL,请选择 PackageReceivedIF,然后选择 Open with => XML Source Page Editor。类似地,您可以打开 PackageReceivedBO 模式。

现在您已经准备好构建实际的中介组件。

C. 创建中介

  1. 在 WebSphere Integration Developer 中,双击 PackageReceivedModule 组装图标 组装图标 打开组装编辑器。将创建一个名为 Mediation1 的缺省中介流组件。将此组件重命名为 PackageReceivedMediation
  2. 接下来,需要创建一个将中介连接到实际服务提供程序的导入(在本例中为 MDB)。从面板中拖动一个导入并将其放在中介流组件的右侧。将此导入重命名为 MDBImport。右键单击 MDBImport,然后选择 Add Interface
  3. 在下一个对话框中,选择您先前创建的 PackageReceivedIF 接口。这些操作的基本目的是创建一个接口,并将该接口分配为用来向 MDB 发送消息;从 ESB 发送的消息必须符合此接口。
  4. 使用连接工具将导入连接到中介流组件。(在任何弹出的窗口上,如果询问您是否可以在中介流组件上生成引用,请单击 OK。)
  5. 服务提供程序实现为 MDB,我们将通过 JMS 与之通信;因此需要在输入上定义 JMS 绑定。右键单击此导入,并选择 Generate Binding...=> JMS Binding 菜单选项。在出现的对话窗口中,我们定义了一组关键值,如图 5 所示。

    图 5. 配置 JMS 输入服务
    图 5. 配置 JMS 输入服务
    • JMS 消息传送域——保留 Point-to-Point(点到点)缺省值,因为我们将使用特定的队列接收消息,这与发布-订阅主题相反。
    • 配置新消息传递提供程序资源——选择此选项将意味着,在中介模块部署到服务器后,会为您自动生成所有相关的 JMS 资源(包括队列及其相应的 SIBus 构件)。
    • 序列化类型——流经中介的消息在通过导出接收时将转换为业务对象,并在通过导入传出时将转换为相应的输出格式。对于 JMS,您需要告诉系统使用哪个类来进行此转换。WebSphere ESB 提供了两个预构建的类来获取特别格式化的 XML 消息,并将其转换为业务对象格式(或反之)。在我们的示例中,您将使用带有 JMS TextMessage 的类,并将其转换为业务对象。文本消息必须遵循特定的格式,以便转换程序类能够确定要使用的正确业务对象。下文还将谈到这一点。

      (WebSphere ESB V6.0.2 将引入对不包含 XML 的 JMS 消息的支持,该消息不能映射到业务对象,但可以具有任意内容。有关如何为 JMS 内容创建序列化逻辑的更为详细的描述,请参见 使用 JMS 和 WebSphere ESB 构建强大而可靠的 SOA。)

    • JMS 函数选择器——我们介绍过如何作为服务查看接收 JMS 消息的应用程序,还记得吗?这意味着它支持一个或多个操作。对于基于 JMS 的服务,可以对多个操作重复使用一个队列。因此,您需要告诉系统要将哪种类型的消息映射到服务上的哪个操作。WebSphere ESB 是通过设置一个名为 TargetFunctionName 的 JMS 标头字段实现这一点的,它包含传出消息上被调用操作的名称。接收应用程序(在我们的示例中为 PackageReceivedMDB)现在可以通过检查此标头来区别这两种操作。不过在本文的示例中,我们不使用此应用程序,因为 MDB 仅支持一种操作。因此,请取消选中此选项。
  6. 在按上面的描述设置所有值之后,请单击 OK 以生成绑定。
  7. 在组装编辑器中选择导入,并转到该工具底部的 Properties 选项卡。在 Properties 视图中,选择 Summary 选项卡。现在视图应与图 6 所示类似。
    图 6. 导入属性
    图 6. 导入属性

    请注意发送队列的名称如何设置为 PackageReceivedModule/MDBImport_SEND_D。此名称是在创建绑定时自动生成的,并且在部署时将生成相应的构件。在以后配置 MDB 时需要使用此队列名。

  8. 还需要做一件事情,即在传出消息上定义适当的 JMSType。MDB 仅处理具有设置为 package_received 的 JMSType 标头字段的消息(这在 MDB 的部署描述符中定义)。在 Properties 视图的 Method bindings 选项卡中定义 JMSType,如图 7 所示。
    图 7. 方法绑定
    图 7. 方法绑定
     
  9. 返回到组装编辑器,将一个导出拖放到画布上中介组件的左侧,并将其命名为 JMSClientExport。此导出将向 JMS 测试客户机公开中介。
  10. 将 PackageReceivedIF 接口添加到导出,并将其连接到中介流组件。这还将在中介流组件上创建一个接口。使用连接工具将此导出连接到 PackageRecievedMediation。
  11. 与导入类似,我们需要生成到导出的 JMS 绑定,因为通过此方式客户机才能与中介通信。右键单击导出,并选择 Generate Binding...=> JMS Binding 菜单选项。出现的对话窗口与导入的窗口几乎完全相同。这里需要相同的定义(有一处例外),您可以在图 8 中看到。
    图 8. JMS 导出绑定
    图 8. JMS 导出绑定
  12. 对于序列化类型,请确保选择了 Business Object XML using JMS TextMessage。导出将使用缺省 JMS 函数选择器类。如上面所述,传入 JMS 消息必须映射到服务接口上的特定操作,并且缺省选择器类预期将 TargetFunctionSelector JMS 标头字段设置为被调用操作的名称。您将更新下面的客户机应用程序,以设置此 JMS 标头字段。
  13. 单击 OK 生成绑定并查看其 Properties 视图。
  14. 选择 Binding - Endpoint configuration 选项卡,并在该选项卡中选择 JMS Destinations 选项卡。展开 Receive Destination Properties。视图应该与图 9 所示类似。
    图 9. 接收目标属性
    图 9. 接收目标属性

    请注意如何将接收中介消息的队列名称设置为“PackageReceivedModule.JMSClientExport_RECEIVE_D”。我们将确认客户机应用程序使用此队列名称。

  15. 在保存所有更改之后,就可以进行最后一步了,即创建流组件的实现。在组装编辑器中右键单击 PackageReceivedMediation,并选择 Generate Implementation。这将打开中介流编辑器。
  16. 对于我们的示例,我们将其限制为非常简单的中介逻辑:记录经过中介的每条消息。这可以帮助您可视化流经 ESB 的消息。为此,将左边 PackageReceivedIF 上的 package_received 操作(这表示中介流组件连接到输出的接口)连接到 PackageReceivedIFPartner 上的 package_received 操作(这表示中介流组件连接到输入的引用)。在编辑器的下半部分,将 Message Logger 中介元素拖放到画布并连接消息流,以便每条消息都经过日志程序,如图 10 所示。
    图 10. 将每条消息连接到日志程序
    图 10. 将每条消息连接到日志程序
  17. 在中介流编辑器和组装编辑器中保存所有更改。中介模块已经完成,可以部署到服务器了。不过,在部署到服务器之前,您仍需要调整请求程序代码和提供程序配置。

D. 设置服务请求程序

要完成此任务,您需要执行以下常规步骤:

  • 将 J2EE 测试客户机应用程序导入 WebSphere Integration Developer。
  • 在部署描述符(其将作为由 WebSphere ESB 中介模块的导出生成的队列)中配置队列名称。
  • 更新应用程序代码以发送 XML 消息,并根据 WebSphere ESB 的需要设置 JMSHeader TargetFunctionName。
  • 在 WebSphere ESB 服务器上创建一个供客户机用来获取连接的 JMS 连接工厂。

现在,详细内容是:

  1. 导入测试客户机应用程序,该应用程序位于 PackageReceivedClient.ear 文件中。这是一个在以前文章中使用的文件基础上更新的 EAR 文件。下文对这些更新进行了解释。
    1. 在选择 Import => EAR 时,会要求您启用基本的 J2EE 支持(如果尚未启用)。如果是,可以单击 OK 切换到 J2EE 视图。
    2. 在导入过程中,确保您将 EAR 项目命名为 PackageReceivedClientEAR,并选择 WebSphere ESB Server v6.0 作为目标服务器。名为 PackageReceivedClient 的新应用程序客户机项目中有一个 Main.java 文件,其中包含测试客户机的代码。
  2. 接下来,更改接收测试消息的队列的名称,因为您不想将消息发送到 MDB 侦听的队列,而是希望将消息发送到 WebSphere ESB 导出。此名称在客户机项目的部署描述符中引用,因此请双击打开它。部署描述符包含一个名为 jms/PackageReceivedQueue 的引用。将其 WebSphere Bindings => JNDI name 更改为 PackageReceivedModule/JMSClientExport_RECEIVE_D,这是为其导出生成的队列 WebSphere ESB 的名称。
  3. 在最初的测试客户机中,我们向队列发送一个普通字符串。在我们的更新情况中,您将发送一个表示在中介模块中定义的业务对象的 XML 格式的字符串。这使得缺省序列化器能够将此 XML 消息转换为可以在中介中操作的业务对象。遵循您以前创建的接口和业务对象的定义模式,XML 字符串应类似于以下内容:
    <?xml version="1.0" encoding="UTF-8"?> 
    <ns:package_received 
    xmlns:ns="http://PackageReceivedModule/PackageReceivedIF">
       <packageReceivedBO>
          <message>Package Received - 24595023</message>
       </packageReceivedBO>
    </ns:package_received>

    因此,更新的 Main.java 文件发送以下新消息:

    //    private final static String messageText = "Package Received - 24595023";
    
        private final static String messageText = "<?xml version=\"1.0\" 
    encoding=\"UTF-8\"?> " +
    	"<ns:package_received 
    xmlns:ns=\"http://PackageReceivedModule/PackageReceivedIF\"> " +
    	"	<packageReceivedBO>" +
    	"	<message> Package Received - 24595023</message> " +
    	" </packageReceivedBO> " +
    	" </ns:package_received> ";

    另外还需要记住,在 WebSphere ESB 中,您使用缺省的 JMS 函数选择器选取要调用的服务接口上的适当操作。您需要添加一个 JMS 标头字段 (TargetFunctionName) 来指示要调用的操作 (package_received):

    ...
    // Create MessageProducer and TextMessage
    MessageProducer queueSender = session.createProducer(q);
    TextMessage outMessage = session.createTextMessage();
    outMessage.setText(messageText);
    
    // set target operation name for WESB default JMS function selector
    outMessage.setStringProperty("TargetFunctionName", 
    			     "package_received");
    		
    // Set type and destination and send
    outMessage.setJMSType("package_received");
    outMessage.setJMSDestination(q);
    ...

    您会注意到我们已经对代码进行了这些代码更改,因此在这里什么也不需要做。

  4. 您还需要进行一些 JMS 配置,以便 J2EE 客户机应用程序(服务请求程序)能够使用其 JMS 资源连接到 WebSphere ESB 服务器。转到 Servers 视图,打开测试服务器的管理控制台(如果尚未启动该服务器,请启动它)。右键单击 WebSphere ESB v6.0 服务器,并选择 Run administrative console
  5. J2EE 客户机应用程序使用 JMS 连接工厂连接到 JMS 队列。您将在服务器上创建此连接工厂,然后让客户机应用程序从此处检索。客户机然后打开到服务器上 JMS 队列的连接。注意,客户机使用一个指定的端口与服务器上的消息传递引擎通信,缺省情况下,该端口是 7276。不过,在此工具中运行的测试服务器很可能使用不同的端口,因此您必须为连接工厂配置正确的端口号。要找到您的服务器使用的端口号,请转到管理控制台,并单击 Servers => Application Servers... 节点。选择名为 server1 的服务器。现在屏幕将显示有关该服务器的信息,其中有一个名为 Ports 的链接,如图 11 所示。
    图 11. 查找服务器使用的端口
    图 11. 查找服务器使用的端口

    选择 Ports 链接,检索您的服务器使用的端口列表。JMS 通信使用的端口号称为 SIB_ENDPOINT_ADDRESS。在图 12 中,该端口号为 7278。
    图 12. 服务器使用的端口
    图 12. 服务器使用的端口

    记住此端口号。

  6. 现在,在管理控制台中,导航到 Resources => JMS Providers => Default Messaging。单击 JMS connection factory 链接,然后单击 New。输入以下值:
    • 名称:TheConnectionFactory
    • JNDI 名称:jms/TheConnectionFactory
    • 总线名称:SCA.APPLICATION.esbCell.bus
    • 提供程序端口:localhost:7278:BootstrapBasicMessaging

    提供程序端口定义应包含消息传递引擎的端口号(即刚才查找的端口号);在我们的示例中,该端口号为 7278。(特定的计算单元名称因具体配置的不同而有所不同,因此缺省 SCA 应用程序总线的名称在不同的安装中可能有不同的名称。)

    您可以在以下位置找到有关连接到非缺省 JMS 提供程序端口的更多详细信息:WebSphere Application Server 信息中心

    将所有其他字段保留为缺省值,然后单击 OK

  7. 保存您的更改并关闭管理控制台。

E. 设置服务提供程序

我们在前文已经提到,接收 JMS 消息的服务提供程序是使用消息驱动的 Bean 实现的。我们将使用与上一篇系列文章中相同的应用程序;在本文的下载资料中包含了相应的企业存档 (EAR) 文件。

要完成此任务,您需要执行以下常规步骤:

  • 将具有 MDB 的 EAR 导入 WebSphere Integration Developer。
  • 配置部署描述符,以侦听由 WebSphere ESB 中介模块的输入生成的队列。
  • 为 WebSphere ESB 服务器上的 MDB 创建 ActivitationSpec(因为运行 MDB EAR 时也要使用该服务器)。

现在,详细内容是:

  1. 在 WebSphere Integration Developer 中,切换到 J2EE 视图。在导入 PackageReceived.ear 文件之前,在 WebSphere Integration Developer 中启动 WebSphere ESB 测试服务器(如果尚未启动)。
    1. 在导入 EAR 文件时,确保您将 EAR 项目命名为 PackageReceivedEAR。
    2. 选择 WebSphere ESB Server v6.0 作为该项目的目标服务器。将所有其他字段保留为缺省值。
    3. 在导入完成之后,您应该看到一个名为 PackageReceived 的 EJB 新项目,它里面的一个 MDB 叫做 PackageReceived。
  2. 更改 MDB 的部署描述符,将其配置为从 WebSphere ESB 放置消息的队列获取消息。双击部署描述符,在编辑器中将其打开。
  3. 在 PackageReceived MDB 的 Bean 选项卡上,删除 Message 目标项。还需要将从中接收消息的队列的 WebSphere Bindings => Destination JNDI name 更改为 PackageReceivedModule/MDBImport_SEND_D,后者由中介模块的输入的 WebSphere ESB 生成。(如果查看 messageSelector 的值,您会看到它设置为在中介的导入绑定中设置的 JMSType。)现在部署描述符看上去应如图 13 所示。
    图 13. 更新的 MDB 部署描述符
    图 13. 更新的 MDB 部署描述符

    如果在导入后看到任何其他编译错误,请选择 Project => Clean... 重新生成该项目并解决这些错误。

  4. 您还需要在运行 MDB 的服务器(简单地说就是我们的 WebSphere ESB 服务器)上进行一些 JMS 配置,。转到 Servers 视图,打开测试服务器的管理控制台。右键单击 WebSphere ESB v6.0 服务器,并选择 Run administrative console(假设已启动了服务器;如果还没有启动,请现在启动)。
  5. 服务提供程序服务器使用一个消息驱动的 Bean 从 ESB 接收消息。其中,此 MDB 配置为使用包含队列定义的激活规范。这是所有标准的 J2EE 业务,因此我们在部署应用程序之前需要配置激活规范。在管理控制台中,展开 Resources => JMS Providers => Default messaging
    1. 在屏幕的右下部分,单击名为 JMS activation specification 的链接。
    2. 在下面的屏幕中,单击 New 并为新激活规范输入以下值:
      • 名称:PackageReceivedActivationSpec
      • JNDI 名称:eis/PackageReceivedActivationSpec
      • 目标 JNDI 名称:PackageReceivedModule/MDBImport_SEND_D
      • 总线名称:SCA.APPLICATION.esbCell.bus

    (同样,实际的总线名称可能因具体配置不同而有所不同。)
    图 14. 激活规范
    图 14. 激活规范

  6. 保留所有其他缺省值并单击 OK。保存更改。

这是我们需要对服务提供程序执行的所有操作。

F. 运行端到端测试

到现在为止,您已经准备好将整个示例部署到测试服务器,并可以运行它了。

  1. 在 WebSphere Integration Developer 的顶部菜单上,选择 Project => Clean...=> Clean all projects => OK。此操作可以确保为项目生成的代码的一致性。在 Servers 视图中,右键单击 WebSphere ESB Server v6.0,并选择 Add and remove projects...
  2. 在结果对话框中,首先选择 PackageReceivedModuleApp,然后单击 Add >
  3. 接下来,将 PackageReceivedEAR 添加到服务器,然后单击 Finish。通过按此顺序进行添加,您可以确保首先加载 PackageReceivedModuleApp(必须加载 PackageReceivedModuleApp 的原因是它设置 MDB EAR 使用的目标)。如果加载项目的顺序不对,可能在加载 ActivationSpec 的过程中看到错误消息,指示找不到目标。
    图 15. 将可用项目添加到配置的项目
    图 15. 将可用项目添加到配置的项目

    注意,不会将客户机服务程序部署到服务器,因为服务器作为客户机运行,所以不会对其进行部署。

  4. 在完成发布步骤后,请停止并重新启动服务器,方法是使用工具中的 RestartStopStart 按钮。在重新启动时,两个应用程序均应顺利启动,而不会发生任何问题。确保成功启动应用程序的一个方法是再次启动管理控制台,并选择 Applications => Enterprise Applications。这会显示一个应用程序列表,其中包含您刚才安装的两个应用程序——而且所有这些应用程序都应该启动(图 16)。
    图 16. 应用程序状态
    图 16. 应用程序状态
  5. 要运行测试客户机应用程序,请从 WebSphere Integration Developer 主菜单中选择 Run => Run...
  6. 在下面的对话框中,选择 WebSphere v6.0 Application Client 配置,然后单击 New
  7. 在这个新的配置中,选择 WebSphere ESB Server v6.0 作为 WebSphere 运行时,输入 PackageReceivedClientEAR 作为 Enterprise 应用程序,并使用 PackageReceivedClient 作为应用程序客户机模块。另外,选中 Enable application client to connect to a server 复选框,并选择 Use specific server WebSphere ESB Server v6.0 选项,如图 17 所示。
    图 17. 选择配置
    图 17. 选择配置
  8. 现在可以单击 Run 启动客户机了。在客户机完成之后,在控制台中将显示如下内容:
    图 18. 控制台中的应用程序状态消息
    图 18. 控制台中的应用程序状态消息

    这些控制台消息指示消息已提交到第一个队列,中介流组件将从该位置获取该消息,并对其进行记录,然后将其转发到第二个队列,进而将其提交到 MDB。

  9. 您可以在不同的进程之间切换控制台视图,显示应用程序客户机的输出和服务器进程
    图 19. 切换控制台视图
    图 19. 切换控制台视图

    将控制台输出切换到测试服务器进程。

  10. 中介流组件和 MDB 运行在同一服务器中,因此它们的输出同时显示在控制台中。
    图 20. 中介流组件的控制台消息和消息驱动的 Bean
    图 20. 中介流组件的控制台消息和消息驱动的 Bean

与打印输出相关的数据库指示消息日志记录器元素已执行,并且 System.out 消息来自 MDB。

结束语

本文描述了如何将具有发送方应用程序和接收方应用程序的简单点到点 JMS 场景转换为在这两个应用程序之间建立 ESB 中介的场景。ESB 提供了对所关注内容的分离和独立,因为像日志记录之类的内容现在可以在 ESB 中介中进行处理,而不需要在提供程序和/或使用者代码本身中进行处理,因此建立了 SOA 的两个核心原则。

在我们的场景中,我们使用了 WebSphere ESB 及其对 JMS 协议绑定的支持来创建中介。尽管在本示例中我们使用了 JMS 作为 ESB 两端的协议,但我们在以后的部分中将介绍如何在中介组件中使用不同的协议,让 ESB 处理协议切换。

在下一篇文章中,我们将重点介绍更为面向 Web 服务的场景,在继续下一篇文章之前,我们将这两种情形(JMS/MQ 和 Web 服务)结合在一起。请继续关注!

另外,还需要说明一点:在本系列文章的第 3 部分中,我们将使用 WebSphere ESB 和 WebSphere Integration Developer 工具的新版本 6.0.2 版。

下载

描述 名字 大小 下载方法
Sample application
PackageReceivedModule.zip
20 KB
Sample application EAR file 1
PackageReceivedClientEAR.ear
4 KB
Sample application EAR file 2
PackageReceived.ear
4 KB

参考资料


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织