了解如何使用 IBM® WebSphere® Process Server、WebSphere Enterprise Service Bus、WebSphere Integration Developer 和 Java™ Message Service 绑定来创建发布/订阅交互模式的基础知识。
引言
众所周知的发布/订阅交互模式(有关定义,请参见 Wikipedia)支持面向服务的体系结构的主要原则之一——松散耦合。在发布/订阅上下文中,消息或事件的发布者或生产者并不了解有关该消息或事件的任何潜在的订阅者或使用者。只有主题将发布者和订阅者联系起来;发布者发布某个主题,而订阅者则订阅该主题。底层消息传递或事件基础结构负责将主题从发布者传递到订阅者。
这对 IBM WebSphere Process Server V6(以下称为 WebSphere Process Server)和 IBM WebSphere Enterprise Service Bus V 6.0.1(以下称为 WebSphere ESB)意味着什么呢?两者都使用许多行业供应商支持的服务组件体系结构 (SCA)。有关更多信息,请参阅 developerWorks 文章服务组件体系结构。图 1 显示了 SCA 模块,该模块是 SCA 的基本组装模型。SCA 模块通过导出和导入操作与其他 SCA 模块进行通信。导出操作允许模块接收请求,而导入操作则允许模块发送请求。
图 1. SCA 模块
将发布/订阅映射到 SCA 环境在逻辑上会产生诸如图 2 之类的结果。发布者可以通过导入操作来利用具有发布/订阅功能的通信基础结构,而订阅者则可以通过导出操作来利用相同的通信基础结构。关键的一点是,用于实现发布/订阅交互模式的是通信基础结构,而不是 SCA 环境、发布者或订阅者。
图 2. 使用 SCA 进行发布/订阅
WebSphere Process Server 和 WebSphere ESB 使用 SCA 环境,该环境支持多个绑定以便在服务之间进行交互。最常用的绑定是 Web 服务绑定(通过 HTTP 或 JMS),但遵循 JAX-RPC 的 Web 服务绑定通常不支持发布/订阅交互模式,甚至通过 JMS 也不能支持该模式。同样地,SCA 绑定通常也不支持发布/订阅交互模式。JMS 绑定可以支持发布/订阅交互模式,因为 JMS 1.1 要求 JMS 提供程序支持发布/订阅功能(请参阅 Java Message Service 1.1 规范)。
 |
Web 服务通知系列规范处理发布/订阅交互模型,但 SCA 尚未具有针对该模型的绑定。 | |
本文描述使用 JMS 绑定并将 WebSphere Application Server 缺省消息传递提供程序用作 JMS 提供程序来创建发布/订阅交互模式的基本技术。WebSphere Application Server Version 6(以下称为 WebSphere Application Server)或其他版本中的缺省消息传递提供程序支持 JMS API 的所有工具。具体说来,它为点到点交互提供队列,并为发布/订阅交互提供主题空间。图 3 显示了本文附带的发布/订阅应用程序。发布者模块使用带有 JMS 绑定的导出操作将请求发布到任何订阅者。JMS 绑定将该请求传递到缺省消息提供程序主题空间。两个订阅者(Subscriber1 和 Subscriber2)从主题空间接收该请求。
图 3. 使用 SCA 进行发布/订阅的实现细节
本文假定您使用的是 WebSphere ESB V6.0.1 或更高版本。还假定您熟悉 IBM WebSphere Integration Developer v. 6.0.1(以下称为 WebSphere Integration Developer)或更高版本的使用,以帮助进行附带的示例中的 SCA 模块的构造和测试。


|
回页首 | |
设置发布/订阅基础结构
在创建发布者和订阅者模块之前,您需要设置 JMS 基础结构。第一步是创建 WebSphere Application Server 缺省消息传递提供程序主题空间,如图 3 所示。第二步是创建所需的 JMS 构件:JMS 连接工厂、JMS 主题和 JMS 激活规范。有关详细信息,请参阅 在服务集成总线中部署发布/订阅应用程序。
要创建主题空间,请完成下列步骤。WebSphere Application Server 必须正在运行,以便可以使用管理控制台。
- 在 WebSphere Integration Developer 中,启动 WebSphere Process Server 实例,然后登录到管理控制台。
- 在左边的导航窗格中,选择 Service Integration => Buses。您将看到 SCA 环境创建的若干总线的列表。具体说来,您应该看到
SCA.APPLICATION.widCell.Bus
。该总线管理应用程序特定的队列和主题空间;然而,您可以为应用程序特定目的创建独立的总线。
- 选择 SCA.APPLICATION.widCell.Bus => Destinations。
- 此时将显示当前定义的总线目的地的列表。
- 单击 New。
- 您可以创建多种类型的目的地。在本例中,发布/订阅要求一个主题空间,因此,请选择 Topic space 并单击 Next。
- 输入
TheTopic
作为 Identifier,然后单击 Next。
- 再次单击 Next,然后单击 Finish。
- 保存更改。您应该在列表中看到新的目的地,如图 4 中所示。
图 4. 显示主题的总线目的地
要使 SCA 模块能够使用您通过 JMS 绑定创建的主题空间,您需要创建所需的 JMS 构件:JMS 连接工厂、JMS 主题和 JMS 激活规范。
- 在管理控制台的导航窗格中,选择 Resources => JMS Providers => Default Messaging。
- 在 Default Messaging Provider 对话框中,将范围保留为 Node,选择 JMSconnection factory,然后单击 New。
- 在 Create 对话框中,输入下列值:
- Name:
TheCF
- JNDI name:
jms/TheCF
- Bus name:
SCA.APPLICATION.widCell.Bus
- 让所有其他值都采用缺省值,然后单击 OK 并保存更改。您应该看到新连接工厂,如图 5 所示:
图 5. JMS 连接工厂
- 返回到 Default Messaging Provider 对话框并选择 JMS topic,然后单击 New。
- 输入下列值:
- Name:
TheTopic
- JNDI name:
jms/TheTopic
- Topic name:
TheTopic
- Bus name:
SCA.APPLICATION.widCell.Bus
- 让所有其他值都采用缺省值,单击 OK,然后保存更改。您应该看到 JMS 主题,如图 6 所示:
图 6. JMS 主题
- 返回到 Default Messaging Provider 对话框并选择 JMS activation specification => New。
- 输入下列值:
- Name:
TheTAS
- JNDI name:
jms/TheTAS
- Destination type:
Topic
- Destination JNDI name:
jms/TheTopic
- Bus name:
SCA.APPLICATION.widCell.Bus
- 让所有其他值都采用缺省值,单击 OK,然后保存更改。您应该看到 JMS 激活规范,如图 7 所示:
图 7. JMS 激活规范


|
回页首 | |
创建业务逻辑发布者
现在,您可以创建发布者 SCA 模块(如图 3 所示)。在此示例中,发布者模块模拟业务逻辑,该业务逻辑必须理解该发布者模块为发布者。鉴于此,您必须在开发时选择绑定。
要创建发布者 SCA 模块,请先创建包含业务对象的库以及发布者和订阅者将会使用的界面。要完成此任务,请执行以下步骤:
- 在 WebSphere Integration Developer 中,打开 Business Integration 透视图。
- 选择 New => Library,输入
PubSubLib
作为 Name,然后单击 Finish。
- 展开 PubSubLib 并选择 Data Types => New => Business Object。
- 在 Name 字段中,输入
Order
并单击 Finish。
- 以
string
类型添加 name
和 item
属性。应如图 8 所示显示 Order 业务对象。
图 8. Order 业务对象
- 接下来,在 PubSubLib 中单击 Interfaces => New => Interface。
- 在 Name 字段中,输入
Orders
并单击 Finish。
- 将单向操作添加到该界面,并将该操作命名为
send
。该操作必须是单向的,以允许创建发布/订阅绑定。
- 将输入参数添加到该发送操作,该输入参数的名称为
order
且其类型设置为上面创建的 Order 业务对象。新界面应该如图 9 所示:
图 9. Orders 界面
- 在 Business Integration 视图中,单击 New => Module。
- 在 New Module 对话框中,输入
Publisher
并单击 Finish。
- 为 Publisher 打开依赖关系编辑器并添加 PubSubLib 作为库。
- 打开 Publisher 的组装关系图。
- 通过选择导入将导入操作添加到模块,然后转到 Properties 视图。
- 单击 Description 选项卡并将 Display name 设置为
Publish
。
- 选择 Publish 导入,然后应用 Orders 界面。
- 右键单击 Publish 并选择 Generate Binding => JMS Binding。
- 在 JMS Import Binding 对话框(如图 10 所示)中,为 JMS messaging domain 选择 Publish-Subscribe,并为 Serialization type 选择 Text。单击 OK。如果您正在处理的组件使用基于 XML 的消息,则 Text 绑定通常是最好的。
图 10. JMS Import Binding 对话框
- 在 Properties 视图中,选择 Binding 选项卡。
- 在 JMS Import Binding 选项卡中,输入
jms/TheCF
作为连接工厂的 JNDI Lookup Name,如图 11 所示:
图 11. JMS Import Binding 连接工厂
- 在 JMS Destinations 选项卡中,展开 Send Destination Properties。
- 输入
jms/TheTopic
作为主题的 JNDI Lookup Name,如图 12 所示:
图 12. JMS Import Binding 的发送目的地属性
- 保存模块。请注意,图 11 和 12 中的一些字段是以灰色显示的。这是因为这些字段的值来自使用提供的 JNDI 名称进行查找的 JMS 构件。
图 13 所示的发布者现在已经完成。将 Publisher 部署到 WebSphere Integration Developer 测试环境服务器。您实际上并不需要任何真正的业务组件以驱动导入,因为 WebSphere Integration Developer 的模块测试功能将模拟业务组件。
图 13. Publisher 组装关系图


|
回页首 | |
创建业务逻辑订阅者
接下来,创建订阅者 SCA 模块(类似于图 3 中所示的模块)。在此示例中,订阅者模块模拟业务逻辑,该业务逻辑必须理解该订阅者模块为订阅者。这样做的原因是,对于当前产品,您必须在开发时选择绑定。
- 在 Business Integration 视图中,选择 New => Module。
- 在 New Module 对话框中,输入
Subscriber1
并单击 Finish。
- 为 Subscriber1 打开依赖关系编辑器并添加 PubSubLib 作为库。
- 打开 Subscriber1 的组装关系图。
- 通过选择导出将导出操作添加到模块,然后转到 Properties 视图。单击 Description 选项卡并将 Display name 设置为
Subscribe1
。
- 选择 Subscribe1,然后应用 Orders 界面。
- 右键单击 Subscribe1,然后选择 Generate Binding => JMS Binding。
- 在图 14 中所示的对话框中,为 JMS messaging domain 选择 Publish-Subscribe,并为 Serialization type 选择 Text,然后单击 OK。
图 14. JMS Export Binding
- 在 Properties 视图中,选择 Binding 选项卡。
- 在 JMS Export Binding 选项卡中,输入
jms/TheTAS
作为激活规范的 JNDI Lookup Name,如图 15 所示:
图 15. JMS Export Binding 连接工厂
- 选择 JMS Destinations => Receive Destination Properties。
- 输入
jms/TheTopic
作为主题的 JNDI Lookup Name,如图 16 所示。
图 16. JMS Export Binding 的接收目的地属性
- 保存模块。对于 Publisher 导入,一些字段是以灰色显示的,因为这些字段的值来自通过提供的 JNDI 名称进行查找的 JMS 构件。
- 要证明 Subscriber1 获取并可以处理由发布者发送的信息,请将一个简单的 Java 组件添加到模块并将该模块连接到导出,如清单 1 所示:
清单 1. 为 Subscriber1 的 Java 组件发送方法实现
public void send(DataObject order) {
//TODO Needs to be implemented.
System.out.println("Got to Subscriber1");
}
|
- 右键单击 Java 组件以添加实现。将一个简单的输出插入到控制台(如图 17 所示)。
图 17. Subscriber1 模块的组装关系图
- 保存模块。Subscriber1 模块现在已经完成。现在,您可以将 Subscriber1 部署到测试环境服务器。
为另一个名为 Subscriber2 的订阅者重复上面的 Subscriber1 的说明,然后部署 Subscriber2。


|
回页首 | |
测试业务解决方案
由于 Publisher、Subscriber1 和 Subscriber2 模块已部署到测试服务器,因此,您现在可以进行测试。
- 打开发布者组装关系图,右键单击该关系图并单击 Test Module。
- 为 Order 业务对象的属性输入任意值并单击 Continue。
- 在对话框中,选择您部署了模块的服务器,然后单击 Finish。
- 单击 Console 选项卡。您应该看到如图 18 中所示的内容。控制台的输出显示两个订阅者都收到了由发布者发送的消息。在此实现中,导入操作将请求直接放置在主题空间中,该请求将通过缺省消息传递提供程序通信基础结构传递给两个订阅者。
图 18. 测试配置和结果


|
回页首 | |
创建集成逻辑发布者
如果您不想让业务逻辑知道该集成逻辑发布者正在使用发布/订阅交互模式,您该怎么做呢?或者,更重要的也许是,如果您具有一个现有的业务逻辑,尽管该业务逻辑当前使用点到点交互模式来实现,但您想将该业务逻辑作为发布者,您该怎么做呢?一个解决方案是使用 WebSphere ESB 来实现发布/订阅交互模式。
图 19 显示您可以使用 WebSphere ESB 执行哪些操作。发布者中介通过接受请求并使用上述技术将该请求发布到任何订阅者来协调使用单向操作(使用点到点交互模式)的请求者。在本例中,请求者和发布者之间的绑定并不一定要具有发布/订阅功能。该绑定可以是任意不支持发布/订阅交互模式的绑定:SCA、Web 服务或 JMS(通过队列而不是主题空间)。
图 19. 发布者中介
要在 WebSphere Integration Developer 中创建中介模块(有关更多信息,请参阅 WebSphere Enterprise Service Bus 与 WebSphere Integration Developer 入门),请执行下列操作:
- 在 Business Integration 视图中,选择 New => Mediation Module。
- 在 New Mediation Module 向导中,输入
MedPublisher
并单击 Next。
- 在下一个页面上,选择 PubSubLib 并单击 Finish。
- 打开 MedPublisher 的组装关系图。
- 通过选择 Export 将导出操作添加到模块,然后转到 Properties 视图。
- 单击 Description 选项卡并将 Display name 设置为
PubOrders
。
- 选择 PubOrders,然后应用 Orders 界面。
- 右键单击 PubOrders 并选择 Generate Binding => Web Service Binding。
- 单击 Yes,然后在下一个对话框中选择 soap/http 并单击 OK。
- 将导入操作添加到模块。按照 Publisher 导入绑定的说明来创建发布/订阅交互模式。
- 将导出连接到中介流组件 (Mediation1) 并将该中介流组件连接到导入。
- 保存模块;模块应与图 20 中所示类似:
图 20. 中介模块
- 打开 Mediation1 的中介流编辑器并将导出(由 Orders 界面加以表示)中的发送操作连接到导入(由 OrdersPartner 加以表示)中的发送操作。
- 在请求流中,将导出(由 Request 节点加以表示)中的发送操作连接到导入(由 Invoke 节点加以表示)中的发送操作,如图 21 所示。这会创建传递中介,该中介实质上不进行任何操作;您可以添加各种类型的中介基元以便进行日志记录或转换到请求流(如果需要的话)。由于操作是单向的,因此,中介流编辑器中没有响应流。如果导出操作不是单向的,则会出现响应流且该响应流必须产生一些虚设的响应,因为导入上的单向操作不会出现响应。
图 21. 中介流
MedPublisher 现在已经完成。您可以将 MedPublisher 部署到测试环境服务器。
现在,您必须执行一些额外设置,才能创建表示图 19 中的现有请求者的业务模块。
- 打开 Physical Resources 视图。
- 展开 MedPublisher 项目并找到 PubOrders_OrdersHttp_Service.wsdl,该文件是表示 MedPublisher 中介模块的 WSDL 文件。
- 复制该文件并将其粘贴到 PubSubLib 项目。将其放置在库中可以全面描述 MedPublisher,其中包括可用于使用该库的任何项目的端点地址。
现在创建表示图 19 中的请求者的业务模块。请按照上面的说明使用名为 Orders
的导入创建名为 Requester 的业务模块。此示例假设现有请求者使用 Web 服务绑定。
- 右键单击 Orders 并单击 Generate Binding => Web Services Binding。
- 选择 Orders 导入,然后打开 Properties 视图。
- 选择 Binding 选项卡并单击 Browse。
- 在对话框中,滚动到 PubSubLib,选择 PubOrders_OrdersHttp_Service.wsdl,然后单击 OK。
- 保存模块。您必须在创建业务模块之前创建中介模块,以便可以实际将导入绑定到特定的服务实现。如果请求者已经存在,则该请求者已经具有一个特定的到某个实现的绑定,您必须更改该实现以指向中介模块的导出。
现在,您可以将该请求者部署到测试环境服务器。如果您使用与测试原始发布者模块相同的方式测试请求者模块,您将看到 Subscriber1 和 Subscriber2 都收到了由请求者发送的消息。当然,在本例中,请求者将请求发送到 MedPublisher,而 MedPublisher 又通过导入将该请求放置在主题空间上,然后,缺省消息传递提供程序通信基础结构将该请求传递给两个订阅者。


|
回页首 | |
关于发布/订阅交互模式的其他一些思考
再次检查图 19。从该图中我们可以看出,有另外两点需要讨论:
- 在请求者和发布者中介之间的点到点交互模式中,如果请求者已经使用发布/订阅交互模式(如图 2 所示),该如何呢?没问题。在这种情况下,您可以使用针对订阅者的导出操作来实现发布者中介,和使用上述 Subscriber1 中的导入时一样。其实,发布者会将主题重新发布到订阅该主题的订阅者,并有可能在发布者和订阅者之间进行日志记录和转换。
- 如果想要订阅的订阅者不使用或无法使用发布/订阅交互模式,该如何呢?例如,如果订阅者使用的是 Web 服务,该如何呢?图 22 显示了一个体系结构视图:
图 22. 以点到点的方式进行发布/订阅
在这种情况下,发布者中介需要一个显式的订阅者列表并且必须主动地将请求发送到每个订阅者。这种交互模式有时被称为接收者列表。SCA 和 WebSphere ESB 当前都不具有对接收者列表交互模式的预置支持。您可以构造一组自定义中介基元(请参阅为 WebSphere Enterprise Service Bus 开发自定义中介)以供 WebSphere ESB 实现该模式,不过该内容不在本文的讨论范围之内。


|
回页首 | |
结束语
本文讨论了与发布/订阅交互模式相关的 WebSphere Process Server 和 WebSphere ESB 的一些功能(和局限性)。文中还说明了如何在各种体系结构模式中实现该模式。您现在应该能够在基于 WebSphere 产品系列构建的面向服务的解决方案中利用发布/订阅交互模式了。