复制JMS属性
服务总线设计是考虑到代理服务的接口和调用的业务服务的接口是不同的情况。因此,缺省它不会从输入消息的上下文复制任何信息到输入信息的上下文中(例如:transport header和JMS属性)。
代理服务请求和响应的transport headers 是存储于$inbound,而调用业务服务请求/响应的transport header存于$outbound变量中。
例如:对于单向的消息(交互而不需响应)的情况,XQuery可以将用户定义的JMS属性 从$inbound复制到$outbound:
Insert$inbound/ctx:transport/ctx:request/tp:headers/tp:user-header as first child of ./ctx:transport/ctx:request/tp:headers in variable $outbound.
传输保障
很多情况下,用户在使用产品时,需要了解该产品支持那种类型的消息可靠传递机制。
对于ESB而言,只有当输入请求的传输协议是基于XA连接工厂的JMS方式,而且输出服务的QoS(Qualify of Service)设定为exactly once (此种场景下的缺省配置),系统才实现消息的可靠传递机制。而对于其他场景下,消息可能会丢失或多次传递 。在$outbound变量中指定的QoS通常只是一个暗示,表明希望能够实现可靠传递。对于exactly once 这种服务质量的实现,系统会尽可能实现exactly once 的传输保障,其次它会尽可能提供at least once的传输保障,最后是没有任何传输保障的方式。而此处所指的传输保障会有详细的描述。
对于使用场景(请求输入为 JMS/XA 而 QOS = exactly once),传输保障的提供机制如下:
如果一个路由节点或发布节点的输出传输协议为JMS/XA,那么系统会确保消息从输入通道到输出通道的过程中只传送一次,同时保障传输中消息不丢失或重复。而对于其他的传输协议(如:email, FTP, file, HTTP, HTTPS, JMS/nonXA),系统会确保消息从输入通道到输出通道的过程中传送至少一次,同时保障消息的不丢失。
而对于HTTP(S)协议的消息传输至少一次还需要进一步的考虑。即使目标服务响应(正确的HTTP 状态应答或错误应答),传输过程被认为已经结束。这是因为目标的服务已经返回信息,尽管是验证错误或者页面没有找到,这表明目标服务所在的Server是可用的,而且服务是有可能可以处理其他消息的。如果消息传输过程中,代理服务器或者目标服务器宕机,则目标服务不在或者响应实践超时,则消息会重新传递。
消息重发是基于输入的JMS。重试的次数以及如果次数到了之后的处理可以在WebLogic Server的控制台中配置(并不在Service Bus的sbsoncole中配置)。缺省的,服务总线创建的消息队列,其重试次数为1,当重试次数到了之后,消息会被抛弃掉。
发送消息的重试
除了输入JMS消息之外,还可以对目标服务访问配置重试和负载均衡。负载均衡和容错,以及重试连接的目的是为了提供高效访问和高可用性支持。对于每个消息,URL列表会根据负载均衡的算法自动排列到容错处理的队列上。如果服务结束前,配置的访问重试的次数为N, 如果出现状况,整个访问系列会重试N次,而在每次重试访问之前,会等待所指定的重试间隔。当所有尝试结束,如果仍存在错误,对于路由节点的差错处理管道会被调用以进行后续处理。
对于 HTTP(S) 协议,任除了200和202之外的任何 HTTP状态都会被认为是错误,并会重试。服务总线的错误处理机制的设计是尽量简化、统一和安全的,因此在这样的设计算法下,服务总线对于认证错误之类应答在一段时间范围内是不会矫正该URL,另一方面,ALSB如果对于后续的访问转发的其他URL上,而新的URL也许不会产生类似的错误应答。
内容类型、JMS类型和编码
为了方便的与异构系统的互操作性,用户可以控制消息所使用的内容类型(content type),JMS类型以及编码类型。这是一个通用的使用状况。
服务总线避免在服务定义时,对于外部客户或服务需要或使用信息配置进行假设。这最大化保证客户可以与各种不同的端点服务之间的互操作性。
服务总线继承服务类型或接口调出消息的内容类型。内容类型是email或HTTP(S)协议的一个组成部分。
如果服务类型是XML或SOAP(有WSDL或没有),内容类型是text/xml
如果服务类型是消息方式或其接口为MFL或二进制,册内容类型为binary/octet-stream。
如果服务类型为消息方式。而接口为文本,则内容类型为text/plain。
如果服务类型是消息方式,而接口格式为XML,则内容类型为text/xml。
在代理服务调用一个业务服务时,内容类型可以在输出上下文变量中覆盖,也可以是代理服务应答时,覆盖输入上下文变量中所设定的内容类型。 例如:用户可以通过设定outbound-request的Content-Type为“application/x-www-form-urlencoded“以保障传输HTTP POST请求到目标业务服务上。
对于JMS,除了二进制和文本,还有一个例外,JMS的类型可以在服务定义时候明确配置。
同样的,编码也可以在服务定义时,对调出消息的编码明确指定。
异步请求/响应
一个通用的场景是客户调用了一个代理服务,如Web Service或HTTP,而该Web Service后台所调用的系统提供的是JMS请求/响应。这种场景称为同步转异步过程。反之亦然,称为异步转同步过程。
使用异步请求响应方式可以提供:
请求线程不会被挂起等待应答,因此消除了请求应答阻塞的线程管理情况。因为ESB充分利用了Weblogic 提供的Work Manager处理机制,具体可以WebLogic Work Manager相关文档