应用程序服务器中的 Web Service 原子事务支持
应用程序服务器中的 Web Service 原子事务 (WS-AT) 支持为 Web Service 环境提供事务服务质量。分布式 Web Service 应用程序以及他们使用的资源可以参与分布式全局事务。
- WS-AT 是为原子事务定义协议的具体协调类型。规范包括:
- Web Service 协调 (WS-COOR) 指定 CoordinationContext 和注册服务,参与者 Web Service 可以使用他们来参与特定协调类型提供的协议。规范包括:
- Web Services 协调 V1.0
- Web Service 协调 V1.1
- Web Service 协调 V1.2
WS-AT 支持是对互操作性协议的支持,它没有为事务支持引入新的编程接口。全局事务定界由标准企业应用程序使用 Java™ Transaction API (JTA) 的 UserTransaction 接口提供。如果在全局事务下运行的应用程序组件发出 Web Service 请求,那么 WS-AT CoordinationContext 将隐式传播到目标 Web Service,但是仅当按有关配置事务部署属性的主题中描述的那样设置了相应的应用程序部署描述符时,才存在该情况。
如果应用程序服务器是为包含 WS-AT CoordinationContext 的 Web Service 请求主管目标端点的系统,那么应用程序服务器将在成为事务上下文(目标 Web Service 应用程序将在该上下文中运行)的目标运行时环境中自动建立下级 JTA 事务。
下图为包含 WS-AT CoordinationContext 的 Web Service 请求显示在两个应用程序服务器之间共享的事务上下文。

![[z/OS]](../images/ngzos.gif)
可以配置 WS-AtomicTransaction 协议的策略。 您可以配置客户机是否传播以及服务器是否接收 WS-AT 上下文。要确保客户机在进行出站服务请求时始终发送 WS-AtomicTransaction 上下文,必须使一个策略集与该客户机相关联,并且该策略集必须包括 WS-Transaction 策略类型,而此策略类型的 WS-AtomicTransaction 设置必须为 Mandatory。另外,如果您知道客户机始终调用包含 WS-AtomicTransaction ATAssertion 策略类型属性的远程端点,那么可以将客户机配置为应用提供程序的 WS-Policy 配置,以使客户机自动沿用提供程序的必需策略。
要确保 Web Service 提供程序接收的任何请求包括 WS-AtomicTransaction 上下文,您必须将策略集与该提供程序相关联,其中,策略集必须包括 WS-Transaction 策略类型,并且此策略类型的 WS-AtomicTransaction 设置必须为 Mandatory。
要确保客户机或提供程序从不使用 WS-AtomicTransaction 上下文,必须使一个策略集与客户机或提供程序相关联,并且该策略集包括 WS-Transaction 策略类型,而此策略类型的 WS-AtomicTransaction 设置必须为 Never。您可以将此配置用于您不希望 Web Service 请求在客户机与提供程序之间创建紧密耦合的环境,例如,当企业之间存在请求时可以使用此配置。
如果没有与客户机或提供程序相关联的策略集,或者策略集未包括 WS-Transaction 策略类型,那么将使用缺省的 WS-Transaction 行为。
WS-AT 支持限制
在此版本的应用程序服务器中,不能从不可恢复的客户机进程中启动 WS-AT 上下文。
不能保证每次都将发送到服务器集群并针对同一 WS-AT 事务的工作请求分配到同一个集群成员。在这种情况下,某个事务的工作可能由多个集群成员处理。如果多个集群成员的事务工作争用同一事务资源,那么将导致死锁情况。
应用程序设计
WS-AT 是两阶段落实事务协议,并且仅适合持续时间短的事务。
原子事务通过对资源挂起事务锁定,对隔离了事务更新的资源管理器进行协调。因此,通常建议您不要跨企业域分布 WS-AT 事务。与两阶段落实相比,企业间的事务通常要求更宽松的语义,在此类情况下,可能更适合使用补偿业务事务,例如作为业务流程执行语言 (BPEL) 进程的组成部分或者通过使用 Web Service 业务活动 (WS-BA)。
WS-AT 最适合跨单个企业中部署的 Web Service 来分布事务上下文。只有请求/响应消息交换模式才会传递事务上下文,这是因为事务的发起方(应用程序或容器)在请求完成事务之前必须确保该事务中运行的所有企业任务均已完成。单向请求所调用的 Web Service 从来不会在请求客户机的事务中运行。
服务故障对 WS-AT 事务的影响类似于 Enterprise JavaBeans (EJB) 应用程序异常对事务的影响,如 EJB 规范所述。即使请求者 WS-AT 事务中运行的服务返回了故障,应用程序服务器也不会自动地将该事务标记为“仅回滚”。请求者的异常处理程序选择该事务能否继续处理并选择是否将该事务标记为“仅回滚”。如果请求者正在应用程序服务器中运行,那么可使用标准 JTA 或 EJB API 将该事务标记为“仅回滚”。生成故障的服务组件在返回该故障前可以自行将该事务标记为“仅回滚”。如果服务组件的实现遇到系统异常,那么它通常会允许它的容器处理该异常。应用程序服务器容器在处理由服务实现生成的系统异常时,会自动地将接收到的任何事务上下文标记为“仅回滚”。
应用程序开发
对于 Web Service 应用程序,要使用 WS-AT 不需要特定的开发任务。
对于 JAX-RPC 应用程序,有一些您必须正确设置的应用程序部署描述符,如有关配置事务部署属性的主题中所述。 JAX-RPC 运行时支持 WS-AT 1.0。
对于 JAX-WS 应用程序,通过创建策略集、将 WS-Transaction 策略类型添加到策略集、可选地配置策略类型并将策略集附加到将在 WS-AT 通信中涉及的应用程序或客户机来启用 WS-AT 支持。JAX-WS 运行时支持 WS-AT 1.0、WS-AT 1.1、WS-AT 1.2 和用于 WS-AT 的 WS-Policy 声明。
当 JAX-WS 运行时接收到入站请求时,WS-Transaction 1.0、WS-Transaction 1.1 和 WS-Transaction 1.2 规范级别均受支持。发送出站 JAX-WS 请求时,只能使用一个规范级别。如果目标 Web Service 的 Web 服务描述语言 (WSDL) 或者客户机的 WS-Transaction 策略类型中提供了 WS-Transaction WS-Policy 声明,那么将使用适用于客户机和目标 Web Service 的规范级别。例如,如果目标 Web Service 的主管环境只支持 WS-Transaction 1.0,那么将使用 WS-AT 1.0。如果这两个规范级别都不适用,或者未提供 WS-Transaction WS-Policy 声明,那么将使用事务服务设置中设置的缺省 WS-Transaction 规范级别。
- 对于客户机而言,如果客户机不考虑提供程序的策略,那么该客户机将不会发送任何 WS-AT 或 Web Service 业务活动 (WS-BA) 上下文。此行为相当于 WS-Transaction 策略设置为 Never。
- 对于客户机而言,如果客户机考虑了提供程序的策略,那么当提供程序的策略包括 WS-AT 或 WS-BA 声明时,该客户机将发送 WS-AT 或 WS-BA 上下文。此行为相当于 WS-Transaction 策略设置为 Supports。
- 对于服务器而言,该服务器不接收任何 WS-AT 或 WS-BA 上下文。此行为相当于 WS-Transaction 策略配置设置为 Never。
应用程序开发者不必显式地注册 WS-AT 参与者。应用程序服务器运行时负责注册 WS-AT 参与者,这与在联合了 WS-AT 事务的 JTA 事务中注册 XAResource 的方式相同。事务完成时,应用程序服务器事务服务将以原子方式对所有 XAResource 和 WS-AT 参与者进行协调。
在发出 Web Service 应用程序请求时,如果线程中的 JTA 事务是活动的,那么跨 Web Service 请求来传播该事务,并在目标环境中建立该事务。此过程与通过 IIOP 分发事务上下文类似,如 EJB 规范所述。在目标环境中执行的任何事务工作都将成为同一全局事务的组成部分。
WS-Transaction 策略声明
如果为提供程序的 WS-Transaction 协议配置策略,那么此配置将影响为与策略类型相关联的 Web Service 生成的任何 WSDL 中包含的声明。用于描述使用了 WS-AtomicTransaction 的客户机或提供程序的事务需求的 WS-Policy 声明是 ATAssertion。如果 WS-Transaction 策略类型的 WS-AtomicTransaction 设置为 Mandatory 或 Supports,那么该策略声明将包括在 WSDL 中。
另外,应用程序服务器还可以解析、理解和应用它所解析的 WSDL 中的此类声明。
下面是一个 WSDL 示例。此示例中的 WS-AtomicTransaction ATAssertion 指出,调用端点时,请求消息必须包含 WS-AT 上下文,并且该上下文必须采用 WS-Transaction 1.0 或 1.1 格式。共有两个名称空间以及两个声明(各与一个 WS-Transaction 规范级别相对应),他们使用 WS-Policy ExactlyOne 运算符来指出客户机必须选择所要使用的规范级别。
<wsdl:definitions targetNamespace="bank.example.com"
xmlns:tns="bank.example.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsat11="http://docs.oasis-open.org/ws-tx/wsat/2006/06"
xmlns:wsat10="http://schemas.xmlsoap.org/ws/2004/10/wsat"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:Policy wsu:Id="ATPolicy">
<wsp:ExactlyOne>
<wsat11:ATAssertion />
<wsat10:ATAssertion />
<!-- omitted assertions -->
</wsp:ExactlyOne />
</wsp:Policy>
<!-- omitted elements -->
<wsdl:binding name="BankBinding" type="tns:BankPortType">
<!-- omitted elements -->
<wsdl:operation name="TransferFunds">
<wsp:PolicyReference URI="#ATPolicy" wsdl:required="true"/>
<!-- omitted elements -->
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>