CICS 资源适配器
CICS TG 现在支持能够用于从支持的 J2EE 应用程序服务器到 CICS 的出站通信的三种不同的 JCA 资源适配器:
CICS ECI 资源适配器——此资源适配器实现 LocalTransaction 接口,并提供对资源管理器的本地事务的支持(其中,事务位于单个资源管理器本地,例如 CICS 区域)。JCA 1.0 和 1.5 版可以分别与 J2EE V1.3 和 J2EE V1.4 应用程序服务器一起使用。此资源适配器随 z/OS 和多平台上的 CICS Transaction Gateway 一起提供,并且可以与任何平台上任何版本的 CICS 一起使用。
CICS ECI XA 资源适配器——此资源适配器实现 XA 事务支持,而且完全支持全局两阶段提交事务。该适配器仅在 JCA 1.5 版中提供,并随 CICS Transaction Gateway v6.1 for z/OS 一起提供,在 WebSphere Application Server V6 中与 CICS TG for z/OS 和 CICS TS for z/OS 一起使用。
CICS EPI 资源适配器——此资源适配器可用于访问基于 3270 终端的程序。由于它基于 CICS 3270 接口这一特性,因此不提供全局事务支持,所以不应将其用于 CICS 应用程序的事务集成。同时提供了 JCA 1.0 和 1.5 版本,但它只能用于多平台上的 CICS Transaction Gateway。
z/OS 平台上 WebSphere Application Server 中的 RRS 事务支持
当使用 WebSphere Application Server for z/OS 时,CICS ECI 资源适配器通过使用附加的 RRS 事务模式支持全局事务。当使用本地网关时,将自动利用此 RRS 事务模式。使用本地网关是由 CICS ECI 连接工厂 ConnectionURL 参数中的“local”设置表示的,它指定在 WebSphere Application Server JVM 中资源适配器应直接调用 CICS Transaction Gateway EXCI 接口,因此省去了对独立网关的需求。此共存方法提供了两方面的性能优势,减少了 MVS Resource Recovery Services (RRS) 两阶段提交处理的路径长度和指派。
在使用 CICS ECI 资源适配器或 CICS ECI XA 资源适配器时可提供 RRS 事务支持,并且运行于 WebSphere Application Server V5、V5.1 或 V6 的 JCA 1.0 和 JCA 1.5 资源适配器也提供该支持。
WebSphere Application Server 中的事务支持
WebSphere Application Server 可以为不同类型的 J2EE 组件提供不同的服务质量。这可以通过使用一组隔离的运行时环境(称为容器)实现。这四个容器分别是 Web 容器、EJB 容器、客户端容器和 Applet 容器。在 WebSphere Application Server V5 和 V6 中,JCA 支持是通过 Web 容器和 EJB 容器提供的,这两种容器都支持 JCA 连接池机制和来自 J2EE 组件的事务上下文的传播。
Web 容器
Web 容器的主要功能是针对 Servlet 和 JSP 组件,但是它也提供全局事务支持。然而,Web 容器不提供容器管理的事务服务,但是如果需要,可以通过应用程序以编程方式来控制事务范围。可以通过调用从 ConnectionFactory 获取的 Connection 对象上的 getLocalTransaction() 方法控制资源管理器的本地事务;这提供了特定于 JCA 连接工厂(即 CICS 区域)的单一实例的单阶段提交事务上下文。还可以通过使用 javax.transaction.UserTransaction 接口创建两阶段提交事务上下文来开始和结束事务。此类应用程序必须在 HTTP 请求的生命周期内提交事务。不可能(或不值得)跨多个对 Servlet 的 HTTP 请求扩展事务的生命周期,而且 WebSphere Application Server 回滚在 Servlet service() 方法结束时还没有结束的任何全局事务。
EJB 容器
EJB 容器提供对全局事务的完整事务支持,包括容器管理的事务 (CMT) 和 Bean 管理的事务 (BMT)。会话 Bean 和消息驱动的 Bean 可以使用任一种类型。实体 Bean 仅限于使用 CMT。使用 BMT 的 Bean 负责事务划分并且必须使用 UserTransaction 接口来开始和结束事务。CMT 是首选的机制,因为它把事务控制委托给应用程序服务器,使应用程序开发人员能够专注于开发业务逻辑,同时仍可以根据部署决定应用程序的事务特性。CMT 的事务控制的关键是 EJB 事务属性,下面将讨论该属性。
事务属性
事务属性在 EJB 部署描述符(ejb-jar.xml 文件)中设置,事务属性是控制属性,在控制情形下当调用 Bean 方法时启动全局事务。此事务属性显示在“container-transaction”部分,并使用“trans-attribute”标记指定。例如,以下 XML 定义 CTGTesterCCI Bean 上的远程 execute() 方法具有“Required”事务属性:
2 <method>
3 <ejb-name>CTGTesterCCI</ejb-name>
4 <method-intf>Remote</method-intf>
5 <method-name>execute</method-name>
6 </method>
7 <trans-attribute>Required</trans-attribute>
8 </container-transaction>
9
图 7 显示了如何使用 IBM Rational® Application Developer 中的 EJB 部署描述符编辑器定义这些设置的情况。
图 7. Rational Application Developer 中的事务属性

事务属性的可能值及其描述在表 1 中列出:
表 1. EJB 事务属性 事务属性描述
| 事务属性 | 描述 |
| NotSupported | Bean 方法不在事务的上下文中执行。 |
| Required | Bean 方法将在事务的上下文中执行。 |
| RequiresNew | Bean 方法将在新事务的上下文中执行。 |
| Supports | Bean 方法可以在事务上下文中执行,也可以不在事务上下文中执行。 |
| Mandatory | Bean 方法必须在 EJB 客户机的事务上下文中执行。 |
| Never | Bean 不会在事务上下文中调用。 |
本地事务容器
EJB 2.0 规范没有指定如果在没有全局事务下运行方法时容器的行为。Servlet、使用 Bean 管理的事务的会话 Bean 和一些其他情况会发生这种现象。在该种情况下,应用程序被请求在“未指定的事务”上下文中执行。为了实现一致性和可移植性,WebSphere Application Server 使用本地事务容器 (LTC) 策略执行该未指定的事务上下文。此 LTC 策略是一种有效的划定范围的方法,Web 和 EJB 容器可以使用此方法划分在全局事务外分配的工作的开始和结束。在该 LTC 内对资源管理器的所有访问都通过资源管理器本地事务 (RMLT),在 LTC 结束时必须解决这种事务。没有办法以编程方法与 LTC 范围进行交互;并且 LPC 范围影响 J2EE 应用程序的方法由三个扩展的部署描述符 (XDD) 控制,这三个部署描述符可以在 J2EE 组件部署时设置,如下所示:
Boundary——它可以有值 BeanMethod(缺省)或 ActivitySession。ActivitySession 是对仅仅在 WebSphere Application Server Enterprise Version 5 中适用的 EJB 容器的扩展。它在基于资源管理器的本地事务的边界方法之外提供了一个扩展的工作单元范围。(有关详细信息,请参见 Transactional services in WebSphere Application Server Enterprise V5, REDP3759。)
Resolver——这个可以有值 ContainerAtBoundary 或 Application(缺省)。当在全局事务上下文(例如带有 Never 事务属性)外面的 EJB 容器发出 ECI 请求时,如果 Resolver 属性被设置为 Application,那么 ECI 调用类型是非扩展的。相反,如果 Resolver 属性被设置为 ContainerAtBoundary,那么将会启动资源管理器本地事务,且 ECI 调用类型是扩展的,会被容器在 EJB 方法的边界解决。
UnresolvedAction——它可以具有值 Commit 或 Rollback(缺省)。它可以被指定用于 EJB 或 Web 容器,并表示容器如何使用 LTC 边界上未完成的 RMLT 来清除所有的连接。该属性是 Web 组件 (Servlet) 唯一可配置的 LTC 设置,通过在连接上使用 LocalTransaction.begin() 方法应用于 Bean 管理的事务。在交互完成后,所有的容器管理事务被自动提交,因此在 Web 容器中容器管理的事务不使用该属性。
有关 LTC 策略的使用需要注意以下几点:
LTC 范围对于每个 J2EE 组件而言都是本地的;因此如果在 LTC A 下分派 EJB 组件 A,并且该组件调用 EJB 组件 B,那么需要在一个单独的 LTC 下分派组件 B。
如果应用程序在全局事务外执行,那么容器始终会建立 LTC 范围,除非 Web 组件或 BMT 企业 Bean 是 J2EE 1.3 以前的标准。