· 故障信息。交换实例相关的故障消息的工厂。提供一些方法来创建、设置和查询这些消
息。见createFault(),setFault()和getFault()。
· 事务上下文。如果事务的上下文非空(non-null),执行该交换。见
getProperty()和
setProperty()。事务由常量
MessageExchange.JTA_TRANSACTION_PROPERTY_NAME来命名。
· 属性。一些非
JBI的消息交换特点可以作为属性存储:名称-值对,值(对JBI来说)是
一个不透明的java.lang.Object。
MessageExchange API提供足够的功能支持所有标准MEP。然而,在API层次上并不区分“in”和“out”消息,使得理解Java编码层的消息交换变得困难。为解决这个问题,提供了一套特定的MEP API,在以下四节给出详细介绍。
2.9.8.1 InOnly消息交换(InOnly Message Exchange)
这个子接口为“http://www.w3.org/2004/08/wsdl/in-only”MEP提供API。 提供以下特定的MEP方法:
· setInMessage(msg).只能调用一次,否则再次调用会导致实现抛出一个相应的MessagingException异常。
· getInMessage()。可被多次调用。如果setInMessage()方法(或setMessage(msg,“in”) )没有被调用,返回null.
2.9.8.2 InOptionalOut消息交换(InOptionalOut Message Exchange)
这个子接口为“http://www.w3.org/2004/08/wsdl/in-opt-out”MEP提供API。 提供以下特定的MEP方法:
· setInMessage(msg).只能由服务消费者调用一次,否则再次调用会导致实现抛出一
个相应的MessagingException异常。
· getInMessage().可被多次调用。如果
setInMessage()方法(或
setMessage(msg,“in”) )没有被调用,返回null.
· setOutMessage(msg). 只能由服务提供调用一次,否则再次调用会导致实现抛出一
个相应的MessagingException异常。在此模式中设置“out”消息是可选的。
Page 31 of 67
· getOutMessage().可被多次调用。如果setOutMessage()方法(或
setMessage(msg,“out”) )没有被调用,返回null.
2.9.8.3 InOut消息交换(InOut Message Exchange)
这个子接口为“http://www.w3.org/2004/08/wsdl/in-out”MEP提供API。 提供以下特定的MEP方法:
· setInMessage(msg). 只能由服务消费者调用一次,否则再次调用会导致实现抛出一
个相应的MessagingException异常。
· getInMessage().可被多次调用。如果
setInMessage()方法(或
setMessage(msg,“in”) )没有被调用,返回null.
· setOutMessage(msg). 只能由服务提供调用一次,否则再次调用会导致实现抛出一
个相应的MessagingException异常。
· getOutMessage().可被多次调用。如果
setOutMessage()方法(或
setMessage(msg,“out”) )没有被调用,返回null.
2.9.8.4 RobustInOnly消息交换(RobustInOnly Message Exchange)
这个子接口为“http://www.w3.org/2004/08/wsdl/robust-in-only”MEP提供API。 提供以下特定的MEP方法:
· setInMessage(msg). 只能由服务消费者调用一次,否则再次调用会导致实现抛出一
个相应的MessagingException异常。
· getInMessage().可被多次调用。如果
setInMessage()方法(或
setMessage(msg,“in”) )没有被调用,返回null.
2.10 服务单元
在已安装的引擎或绑定组件中部署的特定于某组件的构件,一般被称为服务单元。服务单元被集成为一个部署文件,称为服务组合。服务组合包含一个部署描述符文件,指定组合中各服务单元的部署方式,如确定将某服务单元部署到那个组件。
服务单元包含内容如下:
? 元数据: 使用或者生成的服务的JBI描述符
Page 32 of 67
? 生成物: 一般是XML信息(可能是二进制,或者目标绑定组件或服务引擎需要的任何对象)
2.11 角色(Roles)
一个功能完善的集成产品须发布一系列满足或超过标准JBI系统要求的关键组件。设计时,JBI对解决方案的多数必要元素是沉默的。例如,服务引擎应该被看作一个业务逻辑的容器,业务逻辑使用的词汇范围从有注释的Java?到XML(如XSLT),这些词汇不是JBI定义的。JBI假定在发布一个总体业务解决方案时,公共的底层对象扮演一些不同的角色。
2.11.1 引擎开发者(Engine Developers)
一个符合JBI规范的服务引擎(SE)实现需要实现规格化消息路由(Nomalized Message Router[NMR]).另外,SE开发者须实现组件生命周期和管理接口,并且必要的话还要实现一个部署接口。如果SE作为一个容器,SE开发者可能要提供用于简化特定的SE产品的工具。
2.11.2 绑定开发者(Binding Developers)
一个符合JBI规范的绑定组件(BC)实现的要求同SE。它们同SE主要的不同点在于,绑定组件使用的远程访问协议和提供的服务不同。
2.11.3 JBI系统提供者(JBI Environment Providers)
JBI兼容的系统的提供者须支持本规范指定的标准化接口。JBI系统可选择使用J2EE?1.4或更新的平台,但不是必须的。如果不支持J2EE,那么必须支持J2SE1.4或更新的版本。
JBI1.0兼容的系统必须支持至少一个WS-I Basic Profile1.1[http://www.ws-i.org/Profiles/BasicProfile-1.1.html]绑定组件的实现。
一个符合JBI规范的系统可选择发布一个服务引擎的实现,但不是必须的。
2.11.4 J2EE?平台提供者(J2EE? Platform Providers)
J2EE?平台提供者可选择发布一个包括服务引擎、绑定组件和应用级工具的完整JBI系统。J2EE?平台提供者当前并不要求必须支持JBI。
Page 33 of 67
2.11.5 JBI应用开发者(JBI Application Developers)
JBI应用开发者使用特定的SE和BC实现定义的词汇和工具,建模、设计、开发和部署业务组件。这样整个JBI系统变得与JBI应用程序开发者无关了。
许多这样的开发者开发XML artifacts来定义服务引擎和绑定组件。这不是传统的重点放在代码编写的J2EE和J2SE领域开发者的工作模式。
2.11.6 举例
下面的例子演示了如何使用JBI系统和组件来完成典型的系统集成任务。 单向消息适配(One-way Message Adapter)
在这个场景中,JBI系统为一条单向消息提供了一个简单的消息适配服务。一条消息从外部发送到JBI系统中,经过转换后发送到外部目的地系统。这是一个简单的点对点的消息传输模式,用于应用到应用(A2A)的整合,如下图所示:
图18 单向消息适配器消息序列图
注意,序列图中的双箭头线表明消息通过NMR路由传递。这是一个非常重要的特征:组件之间是松散耦合的。每一个组件只告诉NMR其所发送消息的目的地的服务名称,由NMR来决定消息路由到哪一个组件。
Client1作为一个服务消费者希望向Service1提供的服务发送一个单向(one-way)服务请求。不幸的是Client1和Service1使用不同的消息格式和消息传输协议,因此需要
Page 34 of 67
采用一个集成中间件来适配两种不同的消息格式和消息传输协议。这里的中间件即是JBI系统,上图表示为中间的大圆角矩形。图中单个的对象包括:
· BC1:使用
Client1采用的消息协议(可能是遵循WS-I BP 1.1的SOAP协议)的绑定
组件。
· SE1:一个提供轻量级排序服务的服务引擎,可以通过配置对消息进行修改和推进。 · SE2:一个采用· BC2:使用
XSLT1.0转换消息的服务引擎。
Service1采用的消息协议的绑定组件,该例中是HTTP之上的AS2协议。
消息序列图中的消息交换过程详见以下部分:
· Client1 到 BC1。Client1向
Service1发送请求,请求的载荷为REQ1。Service1的服务
端点为BC1,Client1使用自己的消息交换协议与BC1交互。
· BC1将传入的请求规格化为
NM,然后通过NMR路由该消息。本例中JBI实例将到
Service1的请求消息发送到SE1。 (SE1是一个提供轻量级排序和转换服务的引擎)
· SE1选择需要执行的转换类型,向转换服务发送一个请求把
REQ1转换成REQ1A。
NMR将REQ1发送到转换服务SE2,SE2执行转换并同步返回转换结果(标记为REQ1A)到SE1。
· SE1完成其操作后将消息转换结果
REQ1A发送到Service1(NMR会将该结果路由给
BC2)。
· BC2解编规格化消息,将其发送给
Service1(单向)。
3. 管理
3.1 组件安装(Component Installation)
JBI组件(引擎和绑定)使用本章定义的标准管理机制安装。此外,还定义了为这种组件设计的标准包。目的是保证组件的轻量级,包括安装信息。组件供应商可为分布式生产一个单独的包,而不是基于JBI实现目标的多个变量。通过简化组件获取和管理后台使用户获益。
Page 35 of 67