开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2010.12.03
引言
IBM对ESB的产品支持
到目前为止,IBM专门支持ESB实施的主要有3种产品,WAS6SIBUS,WASESB,和WBIMessageBroker。这里按照他们出现的先后顺序简单地介绍一下他们的使用场合:
1)WBIMessageBroker
2)WAS6SIBus
3)WASESB
这是一张关于WASESB与WBIMessageBroker关系的预测图,希望大家能从中得到感性的认识。针对不同的场景和开发者的技术经验,采用更合理的设计方案。
SIBus与MessageBroker的集成
根据我们前面的讲解,无论采用哪一种ESB解决方案,ESB的各个总线之间应该是可以互联的。至少采用IBM产品所开发的ESB总线都因该能够顺利地集成在一起,这样ESB的设想才能成立。用户在SOA和ESB上的投资能得到有效的保护,这也是SOA倡导的核心思想-重用。单纯用SIBus或MessageBroker构建的同类ESB总线,它们之间的交互方式我们在这里就不再讨论了,欢迎大家阅读WAS的信息中心(infocenter)找到答案,技术上的实现并不困难。比较难办的是SIBus(或WASESB)与WBIMessageBroker如何实现互联。下面我们将就这一问题加以讨论。
这样一个案例涉及两个ESB总线的互联。实质上我们要考虑的是两个ESB底层消息中间件如何进行不同格式的消息转换以及不同体系的消息目的地地址如何相互定位。
SIBus与MQ的消息集成
我们在MessageBroker中实现了一个消息流,其中集成了两个生产系统暴露出的订单请求的Web服务。一个是公司内部的甲地的制造企业的生产产品的Web服务接口,而另外一个则是公司内部的乙地的制造企业的订单请求的Web服务接口。而产品的订单请求具体是到甲厂还是乙厂生产,则取决下订单时所携带的路由信息。
MessageBroker的消息流处理的是MQ的队列的消息,因此SIBus与MessageBroker的互联实质上只是SIBus与MQ的互联。SIBus只会与WBIMessageBroker的消息流的入队列和出队列交互。SIBus将订单请求放到MessageBroker的入队列中,而MessageBroker会将消息处理完后放到出队列中。因此在我们这个场景中,我们需要做的就是在用户查询自己的零件的价格时,如果该零件的库存量为零,就需要通过SIBus向MessageBroker部署的消息流的入队列发送一条消息。并且通过读写MessageBroker处理完放入到其MQ出队列中的消息查询所下订单的状态。
Websphere6支持服务集成总线(SIBus)与WebsphereMQ的互联,通过两者的互联,可以实现消息在SIBUS与MQ平台之间信息流的互通,而用户则无需考虑其中的消息格式的转换和寻址。
实现SIBus与MQ互联,需要做的主要工作是在SIBus和MQ中配置与对方通信的相应配置。由于SIBus与MQ是两个单独的产品,所以它们之间的通信需要在配置时使用相同的名称来达到识别的目的。
在SIBus上需要定义外部总线,消息引擎的MQ链接等。其中的消息引擎的MQ链接是关键之处,其发送方通道的配置告诉SIBus如何找到WebsphereMQ的队列管理器,而接受方通道则是从MQ接受消息。
在WebsphereMQ中的配置相对来说则更易理解,因为MQ中的配置其实就是与远程队列管理器的配置一样。在MQ看来,SIBus上的消息引擎似乎就是一个远程主机上的MQ队列管理器,通过在MQ上定义发送方通道和传输队列,就可以实现两者的连接。如果需要从MQ上发送一个消息到达SIBus上只需在MQ上定义一个远程队列。远程队列的作用就是将消息映射回SIBus上定义的本地队列中。
下面分别介绍在SIBus与MQ中需要做的配置,以及在配置完成后如何定义队列使的消息可以实现在SIBus和MQ之间自由发送。详细的配置步骤会在样例下载中有安装文档说明,这里只是介绍重要的概念。
SIBus中的配置
1)首先需要在SIBus中定义外部总线,需要注意的是必须将"路由定义类型"选为"直接,MQ链接",这说明了外部总线的类型。当需要在Websphere中互联SIBus时就需要定义外部总线。这里我们虽然不是SIBus之间的互联,但是为了和Websphere之外的MQ连接,也需要定义外部总线。在外部总线上我们可以定义属于其的外部目标,而这个外部目标将扮演MQ中的队列在SIBus中的代理。下面我们在配置消息传递引擎上的MQ链接时,需要使用这个外部总线名。
2)定义消息传递引擎,把服务器作为总线成员添加后,总线上就会有对应的消息传递引擎。消息传递引擎会实际负责与MQ通信的处理。我们需要在消息传递引擎中创建"WebsphereMQ链接"来设置其与MQ互联的参数。
选择"LOCALBUS"的"其他属性"=>"消息传递引擎"。单击引擎名,选择"其他属性"=>"WebsphereMQ链接",一共有四个步骤需要完成。分别详细说明如下。
步骤1、链接名称设置为"BusToMQ",外部总线选择"FOREIGN_BUS",队列管理器名称"QM_TheBus",单击"下一步"。
链接名称是一个可选的参数,可以自由命名。但是外部总线名称必须选择在此之前创建的外部总线,例中为"FOREIGN_BUS"。队列管理器的名称也很重要,前面说过,消息传递引擎在MQ看来就类似一个远程的MQ,而MQ与SIBus的通信方式与普通的远程主机上的MQ的通信的配置并没有什么不同。既然消息传递引擎模拟MQ,那么我们就需要定义队列管理器的名称。例中为QM_TheBus,这个名称在后面MQ的配置仍然会发挥作用。它必须与MQ中定义的发送方通道的传输队列的名称一致。它也是在MQ中定义一个远程队列时所映射到的SIBus上的本地队列的队列管理器的名称。
步骤2:发送方通道WebSphereMQ链接属性。发送方通道和接收方通道成对地起作用。该通道将成为用于将消息从总线发送到WebSphereMQ的连接。它需要与我们的MQ的队列管理器所使用的名称、主机名和端口相匹配,以接收来自总线的消息。缺省情况下,队列管理器使用端口1414接收传入的消息。由于我们的样例中MQ与SIBus存在于同一台主机上,因此主机名为localhost。这也是MessageBroker所部署的消息流所在的主机名。
需要注意的是这里定义的发送方MQ通道名必须与后面MQ配置中定义的接受方通道名一致。在没有启用安全性的情况下,传输链选择如图所示的OutboundBasicMQLink
步骤3:接受方通道的名称必须与MQ中定义的发送方通道的名称设置一致,输入"MQToBus"。
步骤4:其他所有的选项都使用缺省选项,保存之。
MQ中的配置
MQ中的配置主要是两个通道,一个是用来接受SIBus的消息传递引擎发送过来的接受方通道,其名称必须与SIBus中消息传递引擎的发送方通道名称一致。另外一个是用来向消息传递引擎发送消息的发送方通道,需要首先定义一个传输队列,并且设置远程主机的地址和端口。
1)创建传输队列
在WebsphereMQ资源管理器的队列中新建一个本地队列,名称设置为"QM_TheBus",使用类型选择为"传输"。
2)定义MQ发送方通道
在WebsphereMQ资源管理器中选择高级=>通道,选择新建发送方通道。
3)定义接受方通道
同样在高级=>通道中新建一个通道,这次选择接受方通道。将通道名称设置成SIBus中定义的发送方通道的名称"busToMQ",传输协议选择"TCP/IP"。
从SIBus向MQ发送消息
现在SIBus与MQ互联必需的两者之间的配置已经完成了。为了使订单请求能够从SIBus上到达MQ,我们需要在SIBus上定义一个远程目标(ForeignDestination)。这个远程目标是MessageBroker的MQ入队列在SIBus上的代理。发送到SIBus上的这个远程目标的消息将会通过SIBus上的消息传递引擎和MQ的接受方通道最终达到MQ的队列管理器上的队列中。订单消息到达这个队列后,因为是MessageBroker部署的消息流的入队列,MessageBroker会取走这个消息,随后做处理,处理后的消息会存放在MessageBroker定义的出队列中。例中MQ的队列管理器为WBRK_QM.。
1)在总线的"其他属性"=>"目标",点击进入,选择新建,目标类型选择"外部"。
2)设置属性
从MQ向SIBus发送消息
MessageBroker处理结束的订单状态的消息到达MQ出队列后,我们需要将它发送到SIBus上。为了完成这个任务,需要分别在SIBus上定义队列目标和在MQ上定义远程队列。SIBus上的队列目标的创建与外部目标的创建过程类似,只是目标类型必须选择"队列"而不是"外部"。SIBus上的队列(例中为LocalQueue)创建成功后,我们就可以在MQ的队列管理器(例中为WBRK_QM)定义一个远程队列映射到SIBus上的队列目标LocalQueue。为了与MessageBroker消息流的处理集成起来,这里在MQ中定义的远程队列也必须同时是在MessageBroker中的消息流的出队列。
1)在WebSphereMQ队列管理器中选择WBRK_QM队列管理器,扩展Queue,右键选择New=>RemoteQueueDefinition
2)输入或设置以下值
MessageBroker中的消息转换
前面讲述的是如何在两个不同的策略实现的ESB上做寻址,但是当消息到达MessageBroker实现的总线时,为了能够调用MessageBroker的消息流中集成的制造厂的订单请求Web服务接口,我们需要对消息的格式进行转换。
MessageBroker中对于消息的处理有很好的语言支持,也就是ESQL,通过它我们可以很方便的根据MQ的消息体中的内容,构造新的SOAP消息。在Web服务返回后,我们需要根据返回的SOAP消息体构建新的MQ消息。
在开发从MQ消息请求制造厂的订单请求Web服务时,需要注意的几个问题是
1)MQ的消息头
为了能将Web服务的返回的SOAP消息重新构造成MQ的消息,我们需要在MQ的消息转换成SOAP消息保留MQ的头消息。在ESQL中通过将MQ的头消息保存到环境中可以达到这个目的。
SETEnvironment.MySavedMQMD=InputRoot.MQMD;
2)MessageBroker中如何集成Web服务的调用
在MessageBroker中提供了一组内嵌的节点可以集成Web服务的调用,HttpRequest节点就是一个用来配置集成Web服务请求的节点。在HttpRequest节点的属性中可以设置甲或乙制造厂的订单请求的Web服务的URL,如下图所示:
3)在ESQL中使用XMLNS域处理消息格式的转换
小结
到这里,SIBus与WBIMessageBroker的集成工作已经完成。在我们的场景中,不同策略实现的ESB的互联发生在当用户查询自己生产的零件的价格并且发现零件库存为零。这时会往SIBus上的外部目标写入订单请求消息。通过互联配置,订单请求消息会到达MQ的队列中。
MessageBroker的消息流根据消息的内容路由到甲或乙两个不同的制造厂。MessageBroker的消息流会将MQ的消息转换成SOAP的请求消息后,请求甲或乙两个不同制造厂的提供的订单请求接口。而订单请求的状态返回也是SOAP的返回消息,再转换成MQ的消息后,将会放到MQ的出队列中。而MQ出队列的消息通过互联的配置又路由回了SIBus中。
回顾一下我们所做的主要工作在于如何在SIBus和MQ中配置与对方的通信,因为是相互独立的软件,所以经常遇到必须将某些名称设置为一致的情况,这是读者在实际配置时必须要注意的一点。由于篇幅的关系,随文可以下载的样例中包含了更加详细的配置说明过程。
参考资料
作者简介
张军,IBMSOADesignCenter工程师,对J2EE、WebService,SIBus以及WBIMessageBroker有着丰富的实践经验。