内容


IBM WebSphere 开发者技术期刊

在服务集成总线中部署发布/订阅应用程序

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: IBM WebSphere 开发者技术期刊

敬请期待该系列的后续内容。

此内容是该系列的一部分:IBM WebSphere 开发者技术期刊

敬请期待该系列的后续内容。

摘自 IBM WebSphere 开发者技术期刊

引言

IBM WebSphere Application Server V6 提供了基于服务集成总线 (SIB) 的新应用程序消息传递平台,并提供了具有高可用性高可伸缩性的通信管线,该通信管线从连接应用程序的网络拓扑对应用程序进行了抽象,使应用程序可以透明地插入总线中,以参与消息交换。新的消息传递平台是符合 JMS 的信息传递提供程序,通过 SIBus 连接到应用程序,并向每个应用程序提供对消息传递服务器的本地进程内访问。SIB 还提供了连接面向服务的体系结构中的组件所需的其他功能:消息中介、Web 服务调用、HTTP Web 服务和 JMS 间的协议转换等等。有关 SIBus 的介绍,请参阅 构建企业服务总线 系列文章。

该消息传递平台同时支持以下两种 JMS 消息传递模型:

  • 点到点
  • 发布/订阅。

将消息驱动 Bean 和 JMS 应用程序部署到服务集成总线中 一文中说明了如何为点到点应用程序配置 SIBus。在本文中,我们将介绍如何配置 SIBus 以支持发布/订阅应用程序,说明 SIBus 如何支持这些应用程序,简要介绍发布/订阅术语,并演示如何部署示例应用程序以测试该设置。

发布/订阅的简要概述

与点到点消息传递模式(消息传递系统将队列上的每个消息都交付给单个接收者)不同,发布/订阅消息传递允许发布者将消息向多个订户广播。发布者和订户通过主题相关,而主题表示订户该兴趣的数据类别。订阅主题的每个订户将收到发布到该主题的所有信息的副本,如图 1 所示。一旦消息传递系统将消息的复本交付给了所有订户,就会将原始消息丢弃。

图 1. 发布/订阅
图 1. 发布/订阅
图 1. 发布/订阅

有两种类型的订阅:持久和非持久,区别在于发出订阅请求的应用程序是否希望接收其未运行时发布的消息:

  • 持久订阅
    当持久订户从消息传递系统断开时,消息传递系统将存储发布到相应主题的消息。当该订户重新连接时,消息传递系统将交付非持久订户会错过的那些消息。持久订户必须显式地从主题取消订阅。JMS 消息传递系统使用以下三个键唯一地标识持久订阅:
    • 主题
    • 连接的客户机 ID
    • 订户的订阅名称。
  • 非持久订阅
    非持久订户从消息传递系统断开连接时,订户不会收到发布到相应主题的任何消息。消息传递系统将在非持久订户断开连接时取消其订阅,在其重新连接时将重新订阅。

订阅的持久性与主题的消息是否具有持久性完全无关。单个主题可以同时拥有持久订户和非持久订户。

使用 SIBus 进行发布/订阅

将消息驱动 Bean 和 JMS 应用程序部署到服务集成总线中 介绍了使用 SIBus 进行点到点消息传递,并说明了 SIBus 是如何作为消息传递引擎的协调组实现的(每个引擎都运行于一个应用服务器内,如图 2 所示)。

图 2. 服务集成总线
图 2. 服务集成总线
图 2. 服务集成总线

如上面提到文章中所述,队列既是 JMS 目的地,也是 SIBus 中的目的地。发布/订阅的 JMS 目的地是主题,而这并不是 SIBus 中的目的地。发布/订阅的 SIBus 目的地是主题空间,而主题空间是主题层次结构的集合。空间内的主题直接对发布到该空间的各种主题进行组织,和使用目录层次结构组织其文件的文件系统非常相似。主题(针对特定方面的消息组)只是主题空间中的树节点,如图 3 所示。

图 3. 主题空间
图 3. 主题空间
图 3. 主题空间

队列与特定总线成员(属于总线的应用服务器或群集)相关,而主题空间则属于整个总线的一部分。主题空间不是在总线成员或消息传递引擎中定义,总线中的每个消息引擎都有一个主题空间的发布点。JMS 主题配置为指向主题空间中的主题;其实现使用发布点发送和接收有关该主题的消息。图 4 展示了 JMS 资源与 SIBus 资源相关的方式。

图 4. JMS 资源与 SIBus 资源的关系
图 4. JMS 资源与 SIBus 资源的关系
图 4. JMS 资源与 SIBus 资源的关系

出于效率考虑,只有在至少拥有一个订户的情况下,主题才会存在于主题空间中。如果主题没有订户,该 JMS 主题仍然作为应用程序资源存在,但发布点将立即丢弃所有已发布的消息。第一个订户订阅后,发布点会在消息发布到主题时将其添加到主题空间,直到最后一个订户取消订阅为止。

发布点不仅供应用程序用于添加和删除与主题有关的消息,还可用于将来自一个消息传递引擎的消息传播到总线中的其他消息传递引擎上。当应用程序将消息发布到主题空间中的主题上时,消息将通过该主题空间的所有发布点,如图 5 所示。

图 5. 发布点
图 5. 发布点
图 5. 发布点

此活动允许总线透明地实现发布/订阅系统,并向位于 SIBus 上的任意位置的订户交付消息。

订户(而非发布者)可以指定包含通配符的主题名称,这将创建订阅多个主题的单个订阅,如主题层次结构中的某个分支。图 6 给出了包含通配符的主题名称如何工作的几个示例。

图 6. 包含通配符的主题名称示例
图 6. 包含通配符的主题名称示例
图 6. 包含通配符的主题名称示例

通过将通配符包含到 JMS 主题定义的主题名称中,订户可以使用单个订阅接收来自多个主题的消息。例如,在图 6 中,PSExampleCompany/* 主题的订户将收到来自以下主题的消息:PSExampleDepartment 和 PSExampleDepartment2。请注意,主题的 JMS 定义也将指定主题空间。要谨记,应用程序不能发布到主题名称中包含通配符的 JMS 主题,因为发布者只能将消息发布到单个主题。

导入并检查示例发布/订阅应用程序

我们已经回顾了发布/订阅的概念以及其在 SIBus 中的实现方式,现在让我们看看将用于测试服务器配置的简单示例应用程序。

本文中包括的下载文件中提供了两个 EAR 文件,其中一个包含发布消息的静态会话 EJB,另一个则包含了两个消息驱动 Bean (MDB),这两个 MDB 将订阅同一个主题(一个为持久订户,另一个为非持久订户)。

按照导入并检查 JMS 和 MDB 应用程序中的说明,使用 IBM Rational® Application Developer 中的 EAR 导入向导将每个 EAR 导入到一个项目中。导入两个 EAR 文件后,使用 Project Explorer 检查其结构。

检查应用程序

展开每个 EAR 的部署描述符部分(图 7)。会发现一个 EAR 包含发布消息的一个会话 Bean,另外有两个消息驱动 Bean。在此示例应用程序中,Subscriber1 是一个持久订户,而 Subscriber2 是非持久订户。

图 7. 示例应用程序中的 EJB
图 7. 示例应用程序中的 EJB
图 7. 示例应用程序中的 EJB

发布者的代码与点到点应用程序的对应项完全一样,这是因为 JMS 1.1 API 允许使用可以产生发布到队列和主题的消息的 JMS 代码。和点到点示例非常相似,其中的会话 Bean 将使用资源引用访问 JMS 连接工厂,而使用消息目的地引用访问目的地。可以使用部署描述符编辑器的 References 选项卡查看引用。有关消息目的地引用的详细信息,请参阅参考资料

图 8. 会话 Bean 的环境引用
图 8. 会话 Bean 的环境引用
图 8. 会话 Bean 的环境引用

与点到点示例中一样,MDB 使用激活规范与其主题关联,这是因为 SIBus 的消息传递平台是使用 J2EE Connector Architecture (J2C) 1.5 版实现的,而此版本支持传入事件。MDB 的绑定中唯一需要您指定的设置就是规范的 JNDI 名称(图 9)。

还可以在 Bean 的部署描述符中指定其他活动配置细节,以覆盖激活规范中的对应项。例如,可以在 Bean 的部署描述符中指定订阅的持久性,而这将覆盖激活规范中指定的持久性设置。在我们的示例中,我们将每个 MDB 的活动配置保留为空,这表示将使用激活规范中的相关细节,使服务器管理员可以在服务器配置中更改这些细节,而无需重新部署应用程序。不过,在很多情况下,您会希望在部署描述符中指定特定的活动配置;例如,希望强制持久性的设置。

图 9. 订户 Bean 的绑定
图 9. 订户 Bean 的绑定
图 9. 订户 Bean 的绑定

(MDB 代码也与点到点文章中的代码完全相同;它将输出其所接收到的每个消息的内容。)

创建和配置 SIBus

既然我们已经回顾了发布/订阅的工作原理,也了解了示例应用程序,接下来就将通过配置 SIBus 创建自己的消息传递基础结构了。我们将创建一个 SIBus 实例,并将应用服务器添加到该总线上,然后创建目的地(如前所述,在 SIBus 中的发布/订阅目的地为主题空间)。随后,我们将配置我们的 JMS 提供程序,以便应用程序能通过 JMS API 与总线交互。在此过程中,我们将深入了解该提供程序的某些配置选项。

创建总线

创建服务集成总线非常简单(请参阅 将消息驱动 Bean 和 JMS 应用程序部署到服务集成总线中,以获得更为详细的说明):

  1. 启动服务器,并打开管理控制台。
  2. 在管理控制台的“Navigation”面板中,选择 Services integration => Buses (图 10)。将随即显示“Buses”对话框。
    图 10. 导航到总线窗格
    图 10. 导航到总线窗格
  3. 单击 New 以创建新总线。
  4. 在“New bus”对话框中(图 11),将该总线命名为 PSExampleBus
  5. 单击 Apply 以创建该总线。
    图 11. 创建新总线
    图 11. 创建新总线

现在已经为示例应用程序创建了总线。

添加总线成员

现在已经有了总线,我们需要将我们的服务器添加为该总线的成员:

  1. 导航到 Buses => PSExampleBus。在 Additional Properties 部分,选择 Bus members (图 12)。
    图 12. 导航到总线成员面板
    图 12. 导航到总线成员面板
  2. 单击 Add 以添加新总线成员。
  3. 在“Add a new bus member”对话框中,选择缺省服务器和缺省数据存储区(图 13),然后单击 Next
    图 13. 添加新总线成员
    图 13. 添加新总线成员
    图 13. 添加新总线成员
  4. 单击 Finish 以创建该总线成员。

现在已为示例应用程序创建了总线成员。

创建主题空间

创建主题空间与队列相似。不过,如前面所述,并不指定哪个总线成员将承载目的地;总线中的每个消息引擎将自动用发布点表示主题空间。

  1. 导航到 Buses => PSExampleBus,然后在“Additional Properties”部分选择 Destinations (图 14)。
    图 14. 导航到目的地面板
    图 14. 导航到目的地面板
    图 14. 导航到目的地面板
  2. 单击 New
  3. 选择 Topic space 作为目的地类型,然后单击 Next
  4. 在“Create new topic space”对话框(图 15)中,将主题空间命名为 PSExampleTopicSpace,然后单击 Next
    图 15. 创建新主题空间
    图 15. 创建新主题空间
    图 15. 创建新主题空间
  5. 单击 Finish 以创建该主题空间。
  6. 保存服务器配置。

现在已经为示例应用程序创建了主题空间。

配置缺省消息传递提供程序

此时,我们需要创建 JMS 资源,以供应用程序使用。由于这些是 JMS 资源,所以将在 SIBus 的 JMS 提供程序(即缺省的消息传递提供程序)中进行创建。我们将在该提供程序中创建这些资源,并将其与总线相关联。

在点到点的文章中,我们已经介绍了如何将 JMS 资源作为总线和应用程序间的中间层使用。在本文的前面已经了解到,对于发布/订阅消息传递,其应用程序连接到总线的方式与点到点消息传递中的连接的方式非常相似(不过主题订阅采用了主题名称通配符和持久性机制,显得更为灵活)。

创建 JMS 连接工厂

此时,我们将创建连接工厂,会话 Beang 将使用此连接工厂连接到消息引擎。

  1. 在管理控制台的“Navigation”面板,导航到Resources => JMS Providers => Default messaging (图 16)。
    图 16. 导航到“Default messaging provider”面板
    图 16. 导航到“Default messaging provider”面板
  2. 在“Default messaging provider”对话框中,选择“Connection Factories”部分下的 JMS connection factory (图 17)。(通过使用 JMS 1.1,我们可以创建统一的 JMS 连接工厂,同时供队列和主题使用。)
    图 17. 导航到“JMS connection factories”
    图 17. 导航到“JMS connection factories”
  3. 在“JMS connection factory”对话框中,单击 New
  4. 在“New”对话框中(图 18),将连接工厂命名为 PSExampleConnectionFactory,并使其 JNDI 名称为 jms/PSExampleConnectionFactory
  5. 在“Connection”部分选择 PSExampleBus 作为总线名称。
    图 18. 创建 JMS 连接工厂
    图 18. 创建 JMS 连接工厂
    图 18. 创建 JMS 连接工厂
  6. 单击 OK 以创建该连接工厂。

现在已为示例应用程序创建了连接工厂。

创建 JMS 主题

如前面所提到的,在 JMS 中,发布/订阅的目的地是主题。应用程序将在 JNDI 中查找主题并发布或使用消息。在服务集成总线中,发布/订阅目的地是主题空间。管理员然后可以在提供程序中定义 JMS 主题,并将其与一个主题空间关联。使用一个名称、一个 JNDI 名称和一个主题名称对 JMS 主题进行定义,其中,结构的主题名称在主题空间中定义。如前所述,主题空间中的主题可以采用主题层次结构的形式进行安排,以使主题名称成为层次结构树中的路径。

了解了这些内容以后,现在需要创建示例应用程序将要用于发布和接收消息的主题:

  1. 在“Default messaging provider”面板中,选择“Destinations”部分下的“JMS topic”(图 19)。
    图 19. 导航到“JMS topic”面板
    图 19. 导航到“JMS topics”面板
  2. 在“JMS topic”对话框中,单击 New
  3. 在下一个面板中(图 21)中,将主题命名为 PSExampleTopic,并将其 JNDI 名称指定为 jms/PSExampleTopic,将其主题名称指定为 PSExampleCompany/PSExampleDepartment/PSExampleTopic。这将定义一个主题层次结构,其根为 PSExampleCompany,根下有一个子节点 PSExampleDepartment,而此节点下又有一个名为 PSExampleTopic 的子节点(该节点为叶子节点),如图 20 所示。
    图 20. 示例主题层次结构
    图 20. 示例主题层次结构
  4. 对于总线名称,选择 PSExampleBus,然后选择 PSExampleTopicSpace 作为此主题的主题空间。
    图 21. 创建 JMS 主题
    图 21. 创建 JMS 主题
    图 21. 创建 JMS 主题
  5. 单击 OK 以创建该主题。

现在已为示例应用程序创建了主题。

创建 JMS 激活规范

激活规范用于将 MDB 绑定到 JMS 目的地。在 WebSphere Application Server V5 中,管理员可以使用侦听器端口,该端口在 WebSphere MQ 提供程序 V6 (请参阅参考资源)或 V5 的缺省提供程序中仍然可用。在第 6 版中,SIBus 的 JMS 提供程序是作为 J2C 传入端口实现的,此端口的侦听器使用激活规范配置。我们将定义两个激活规范,一个用于持久订户,另一个用于非持久订户。

激活规范绑定到 JNDI 中;MDB 的配置将使用 JNDI 名称指定其激活规范。通过采用这个方式,可以将多个 MDB 类绑定到单个激活规范。如果 MDB 为订户,它们全部都将共享激活规范中配置的订阅属性。每个 MDB 都可以覆盖激活规范的属性。不过,更改激活规范中的属性更为容易一些,因为激活规范中的更改并不要求重新部署应用程序,而更改 MDB 的配置需要重新进行部署。

创建激活规范:

  1. 将通过输入消息传递引擎的名称更改激活配置。导航到 Buses => PSExampleBus => Messaging engines(其中会列出消息传递引擎的名称),并复制您的消息传递引擎的名称。
  2. 在“Default messaging provider”面板中,选择“Activation Specifications”部分下的 JMS activation specification (图 22)。
    图 22. 导航到“JMS activation specifications”面板
    图 22. 导航到“JMS activation specifications”面板
  3. 在“JMS activation specification”面板上单击 New
  4. 在“New”面板上,输入或选择以下设置(图 23):
    1. Name: PSExampleSubscriber1Spec
      唯一的管理名称。
    2. JNDI name: eis/PSExampleSubscriber1Spec
      激活规范使用此名称绑定到 JNDI,而 MDB 将使用此名称访问激活规范。
    3. Destination type: Topic
      JMS 目的地类型:队列或主题。由于正在使用发布/订阅,所以选择 Topic。
    4. Destination JNDI name: jms/PSExampleTopic
      此名称指定 MDB 将要侦听的目的地。该目的地必须为前面步骤中指定的类型。可以通过在绑定文件部署描述符下指定 Destination 覆盖该目的地设置。
    5. Bus name: PSExampleBus
      服务集成总线的名称,该总线中包含目的地。
    6. Subscription durability: Durable
      使订户成为持久订户。由于现在是持久订阅,所以必须指定与持久性相关的属性。
    7. Subscription name: subscription1
      订阅名称键,如前所述,JMS 消息传递提供程序使用此键标识持久订阅。
    8. Client identifier: client1
      客户机 ID 键,JMS 消息传递提供程序使用此键标识持久订阅。
    9. Durable subscription home: the name of your message engine
      SIBus 中消息传递引擎的名称。(使用在第 1 步中从 Buses => PSExampleBus => Messaging engines 面板复制的名称。)持久订户断开连接时,服务集成总线将使用此处指定的消息传递引擎存储发布的消息。
    10. 其余设置均采用缺省设置。
    11. 单击 OK 以创建第一个激活规范。
    图 23. 创建第一个激活规范
    图 23. 创建第一个激活规范
    图 23. 创建第一个激活规范
  5. 为非持久订户创建另一个激活规范。在其中,无需指定持久性信息。输入以下信息(图 24):
    1. Name: PSExampleSubscriber2Spec
    2. JNDI name: eis/PSExampleSubscriber2Spec
    3. Destination type: Topic
    4. Destination JNDI name: jms/PSExampleTopic
    5. Bus name: PSExampleBus
    6. Subscription durability: Nondurable
    图 24. 创建第二个激活规范
    图 24. 创建第二个激活规范
    图 24. 创建第二个激活规范
  6. 保存配置。

现在已经为示例应用程序创建了所需的两个激活规范。

继续进行下面的操作之前,从 Servers 视图停止并重新启动服务器,以激活新配置。

测试应用程序

为了部署和测试应用程序,我们将使用 Rational Application Developer。我们还将使用 Universal Test Client (UTC) 调用会话 Bean 以发布消息。如果没有 Rational Application Developer,也可以直接部署 EAR 文件,并编写自己的客户机以测试 EJB 会话 Bean。还可以部署随 WebSphere Application Server 一起提供的 UTC EAR 文件,或使用 WebSphere Application Server Toolkit (ASTK),如 让 WebSphere MQ 成为部署在 WebSphere Application Server 中的应用程序的 JMS 提供程序 中所述。

要测试发布/订阅,请执行以下步骤:

  1. 在 Rational Application Developer 中,转到 J2EE 透视图的 Servers 视图。右键单击服务器,并选择 Add and Remove projects... (图 25)。
    图 25. 向服务器添加项目
    图 25. 向服务器添加项目
    图 25. 向服务器添加项目
  2. 单击 Add All >> 按钮。“Configured projects”窗格将列出所有 SubscribersExample 和 PublishSubscribeExample 项目。
  3. 单击 Finish (图 26)以部署并启动这两个 EAR。
    图 26. “Add and remove projects”对话框
    图 26. “Add and remove projects”对话框
    图 26. “Add and remove projects”对话框
  4. 在 Project Explorer 视图中,展开 PublishSubscriberExampleEJB 项目,选择 PublisherSSB 会话 Bean,然后在弹出菜单中选择 Run => Run on Server... (图 27)。
  5. 在“Server Selection”对话框中,选择在我们已经配置的现有服务器上运行这个 Bean。这将使用“EJB Beans”列表中列出的会话 Bean 的本地 Home 接口启动 Universal Test Client。
    图 27. 运行无状态会话 Bean
    图 27. 运行无状态会话 Bean
    图 27. 运行无状态会话 Bean
  6. 通过单击 PublisherSSBLocal create() Invoke,对 EJB Home 接口调用 create() 方法。在“Results”框中单击 Work with Object 以将该 Bean 添加到“EJB Beans”列表中。
  7. 接下来,选择 publishMessage(String) 连接,并输入 Test Message 1 作为参数值。调用该方法(图 28)。
    图 28. 发布第一条消息
    图 28. 发布第一条消息
    图 28. 发布第一条消息
  8. 切换到 Console 视图。将看到两个订户都收到了消息的一个复本(图 29)。
    图 29. 接收第一条消息
    图 29. 接收第一条消息
    图 29. 接收第一条消息

这表明我们的发布/订阅应用程序正在工作。

测试持久性

我们已经成功地对发布/订阅配置进行了测试,现在让我们测试一下持久和非持久订阅的工作情况。

  1. 返回到 Servers 视图,选择 SubscriberExample 应用程序,并单击 Remove (图 30)以将该项目移动到“Available projects”列表中,然后单击 Finish。删除应用程序将会断开订户的连接。如果订户 MDB 之前使用侦听器端口绑定到消息传递系统(消息传递系统为 WebSphere MQ 或通用 JMS 提供程序时),而没有订户绑定到侦听器端口(即使其为持久的),服务器将在重启时取消订阅。但这些订户是使用激活规范绑定的,因此,一旦创建了持久订阅,在管理员将其删除之前,它们都会存在——即使应用程序被删除也将继续保持(如下面的例子所示)。
    图 30. 删除订户项目
    图 30. 删除订户项目
    图 30. 删除订户项目
  2. 回到 UTC 中,在输入字段中键入 Test Message 2 并单击 Invoke (图 31)。我们的两个订户均为脱机状态;不过 SIBus 将为持久订户保存消息。
    图 31. 发布第二条消息
    图 31. 发布第二条消息
    图 31. 发布第二条消息
  3. 返回 Servers 视图,并重新添加 SubscriberExample(图 32)。
    图 32. 添加订户项目
    图 32. 添加订户项目
    图 32. 添加订户项目
  4. 返回 Console。应该看到只有 Subscriber 1(持久订户)收到了消息的复本(图 33)。
    图 33. 接收第二条消息
    图 33. 接收第二条消息
    图 33. 接收第二条消息
  5. 发布第三条消息(图 34)。
    图 34. 发布第三条消息
    图 34. 发布第三条消息
    图 34. 发布第三条消息
  6. 控制台应该指示两个订户均收到了该消息的复本。
    图 35. 接收第三条消息
    图 35. 接收第三条消息
    图 35. 接收第三条消息

此结果表明持久订户和非持久订户均在正常工作。

结束语

服务集成总线允许采用各种方式集成应用程序,包含了构建发布/订阅消息传递应用程序的功能。本文说明了如何配置 SIBus 以支持发布/订阅,并演示了在总线和 JMS 提供程序上可用的各种配置选项。

致谢

作者感谢 David Currie 审阅了本文。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Rational
ArticleID=94219
ArticleTitle=IBM WebSphere 开发者技术期刊: 在服务集成总线中部署发布/订阅应用程序
publish-date=08172005