图6外部服务提供者消息处理视图
如图所示,一个消费者(SE/BC)创建一个规格化消息NM并将其放入一个新的消息交换(MessageExchange)中.该消息交换的地址被设定为一个服务端点
(ServiceEndpoint),服务引擎未指定用哪一个组件来处理该服务请求。消息交换的发送和接收同前例所示。绑定组件接收到ME后将规格化消息转换为与协议和传输相关的格式,并将其发送给外部服务提供者。
2.6 服务调用和消息交换模式
2.6.1 服务调用
服务调用指服务消费者和服务提供者之间的一个端对端交互的实例。尽管无法在JBI中定义一套完整的服务调用模式,但是JBI实现必须支持以下列表中的交互模式:
· 单向交互(One-Way)模式:服务消费者向提供者发送一个请求,服务提供者不必向消费者返回任何错误(故障)信息。
· 可靠的单向交互(Reliable One-Way)模式:服务消费者向提供者发送一个请求。如果服务提供者处理该请求失败,会向消费者返回出错信息。
· 请求-回复(Request-Response)模式:服务消费者向提供者发送一个请求,并期望服务提供者响应。如果处理请求失败则返回出错信息。
Page 16 of 67
· 请求-选择回复(Request Optional-Response)模式:服务消费者向提供者发送一个请求,并期望服务提供者响应。消费者和提供者接受到一个消息后,都可以选择是否应答。
上述提到的消费者和提供者角色可能是绑定组件也可能是服务引擎。当一个绑定组件作为服务消费者时,说明存在一个外部的服务消费者;同样,当一个绑定组件作为服务提供者时,说明存在一个外部的服务提供者。当服务引擎作为服务提供者或消费者时,说明该服务引擎是一个内部参与者。(不理解)
WSDL 2.0预定义扩展[WSDL 2.0 Extensions]定义了一个消息交换模式(MEP)作为“一个操作中的所有抽象消息的顺序和基数”。JBI使用该模式定义消费者节点和提供者节点之间的交互。该模式根据消息类型(normal或fault)和消息流向来定义。
MEPs总是以提供者的角度来理解。例如,在请求-回复交互模式中, MEP的定义是in-out,其消息流从提供者的角度来看,请求(Request)是输入(in),回复(Response)是输出(out)。从服务消费者的角度看,消息流的方向正好相反,但是NMR在与服务消费者交互过程中使用的MEP总是从服务提供者的角度来说的。当处理WSDL MEPs时,这是一种惯用的处理方式。In-Out模式示意图如图7所示:
图7 In-Out消息交换模式
如图所示,第一条消息(请求)从消费者发送到提供者,从提供者的角度看其方向是输入(in)。第二条消息(回复)是从提供者到消费者,即输出(out)。这些交换是按给定的顺序执行的,从提供者的角度这种交换首先是输入一条消息(in),跟着是输出(out)一条消息,因此这种交互模式命名为输入输出(in-out)模式。
Page 17 of 67
2.6.2 消息交换(Message Exchange)
消息交换(ME)作为规格化消息的“容器(container)”。ME不仅封装了其实现的消息交换模型中的输入(in)消息和输出(out)消息,它还包含了这些消息的元数据信息以及正在进行的消息交换的状态信息。消息交换代表了JBI本地服务调用的一部分。下表说明了服务调用和消息交换模式之间的关系。
服务调用(Service Invocation) 消息交换模式MEP (提供者角度) One-Way In-Only Reliable One-Way Robust In-Only Request-Response In-Out Request Optional-Response In Optional-Out 表 1 服务调用与MEP的映射
图8两服务引擎之间的单向服务调用
上图描述了两个本地服务引擎间的单向服务调用,包括了一个消息交换实例:SE1作为一个服务消费者,通过创建并初始化一个包含了消息请求的in-only消息交换来调用所需要的服务操作。如图中SE1和NMR之间的对象流所示,SE1将该消息交换实例发送到NMR。
Page 18 of 67
NMR决定由哪一个服务提供者提供所请求的服务操作,并把该消息交换实例传输给选定的提供者。在图中表示为NMR到SE2的对象流。
注意,该图示并不意味着调用者必须在交换完成之前阻塞当前线程的执行。调用方在发送和接收消息交换时,调用者可以是事件驱动的,服务引擎的内部状态的前进不必占用着线程资源不放。
图9 SE调用远程JBI实例提供的服务:Robust In With Fault
下面描述图9所示的处于两个不同的JBI环境中的服务引擎之间的可靠的单向调用。注意,规范中未规定如何“联合(federating)”两个分离的JBI实例,该例中两个JBI实例之间通过BC1和BC2提供的通信协议使得两者作为远程的消费者和提供者而相互可见,并不存在影响两者之间服务调用的特殊关系。
SE1构建并初始化了一个可靠的单向(robust-in)消息实例,并发送到NMR(在构建ME实例的过程中,NMR为该实例设定了一个唯一标识“X”)。NMR选择合适的服务提供者,并将消息交换以可靠的单向消息模式发送给BC1。BC1按照其所实现的协议需
Page 19 of 67
求封装消息请求,并将该请求发送给服务提供者,在本例中,恰好是另一个通过BC2发布了一个服务端点的JBI实例JBI2。
当JBI2实例中的BC2组件接收到请求以后,该组件构建一个可靠的单向消息交换实例(“Y”)并发送给NMR。JBI2中的NMR选择合适的服务提供者并将消息交换实例(“Y”)发送给该提供者即SE2。
SE2接收实例“Y”,处理完请求之后,SE2可能选择返回一个故障消息说明发生了一个应用级别的错误。在本例中,SE2可以使用实例“Y”返回故障消息,沿着请求流向的反向路径最后通过消息交换实例“X”到达JBI1中的SE1组件(在此MEP中,存在一个“done”响应信息会沿着相同的路径传递,为了清晰起见未在图中显示)。
图10 SE调用远程服务
下面描述图10所示的JBI服务引擎与JBI系统外部的一个远程服务提供者之间的请求-响应调用。
服务引擎SE创建并初始化一个in-out模式的消息交换实例并发送到NMR,由NMR决定哪一个服务提供者应当处理该调用。在本例中,BC组件被选中,BC接收到该消息交换(in-out模式),将其反规格化(denormalize),然后通过通信协议发送到外部的服务提供者。外部提供者处理消息请求,返回适当的信息(正常的回复或者是应用处理层级的错误消息)。BC组件规格化该回复并封装到消息交换中,然后发送到NMR,最终返回给消费者SE。
Page 20 of 67