技术开发 频道

利用 J2EE Connector Architecture

     事务部署场景

  在这一部分,我们将解释把 Servlet 和 EJB 组件部署到 WebSphere Application Server 环境中的事务本质,以及有效利用事务控制的方法。对于 Web 容器和 EJB 容器两个环境,我们给出了一组常见问题,并且提供了所提出的问题或场景的实际解决方案:

  在同一事务范围内,Servlet 能否发出多个 ECI 请求?

  如何链接到发出 SYNCPOINT 命令的 CICS 程序?

  在同一事务范围内,EJB 组件能否发出多个 ECI 请求?

  怎样发出对全局事务的 CICS 部分的 ECI 请求?

  如果使用 z/OS 平台上的 WebSphere Application Server,事务支持有什么不同?

  在 z/OS 上部署 CICS TG 的好处是什么?

  如果在两阶段提交处理过程中出现网络连接故障,会发生什么情况?

  是否存在单阶段提交协议比两阶段提交协议更有好处的情况?

  如果在全局事务中使用具有本地事务能力的资源适配器(如 CICS ECI 资源适配器),则会发生什么故障?

  如果在 WebSphere Application Server 中使用 ECIRequest 类或 Common Connector Framework (CCF) 类,可以提供什么支持?

  如果 CICS 区域或事务出现意外故障,会发生什么情况?

  部署到 Web 容器

  在 Web 容器中部署的 Servlet 组件缺乏 EJB 组件的大多数事务属性。尽管如此,Web 容器还是支持 RMLT 和 LTC 容器策略,使用这两个策略可以影响 ECI 资源适配器发出的 JCA 请求。

  在同一事务范围内,Servlet 能否发出多个 ECI 请求?

  如果在一个交互中两次调用 execute() 方法,这样会调用两个相应的到 CICS 的 ECI 调用,两者都使用 CICS SYNCONRETURN 选项进行链接。下面的代码示例说明了该方法:

1 Context ic = new InitialContext();
2 cxfn = (ConnectionFactory) ic.lookup("java:comp/env/eis/ECICICS");
3 Connection cxn= cxnf.getConnection();
4 Interaction ixn= cxn.createInteraction();
5 ECIInteractionSpec ixnSpec= new ECIInteractionSpec(SYNC_SEND_RECEIVE,"CICSPROG");
6 JavaStringRecord jsr = new JavaStringRecord()
7
8 jsr.setText("DATA1");
9 ixn.execute(ixnSpec, jsr, jsr);
10 ...
11 jsr.setText("DATA2");
12 ixn.execute(ixnSpec, jsr, jsr);
13 ...
14 ixn.close();
15 cxn.close();
16

  不过,与其在同一事务上下文下运行两个对 CICS 的请求,还不如它们各自在 CICS 中作为独立的工作单元运行,并使用单独的 CICS 镜像事务实例。这是因为在 Web 容器内部,在后续请求发出之前,每个交互都是自动提交的。

  如果您需要两个这样的对 CICS 的请求在同一事务范围内运行,那么有两种解决方案可以考虑。第一个建议的方法是使用 EJB 容器的事务控制(请参见问题 3),第二个方法是以编程方式创建并控制 Bean 管理的事务 (BMT) 的事务范围。通过任何版本的 CICS Transaction Gateway 并使用连接工厂的本地事务支持可以完成此操作,如下面的代码示例所示:

1 Context ic = new InitialContext();
2 cxfn = (ConnectionFactory) ic.lookup("java:comp/env/eis/ECICICS");
3 Connection cxn= cxnf.getConnection();
4 Interaction ixn= cxn.createInteraction();
5 ECIInteractionSpec ixnSpec= new ECIInteractionSpec(SYNC_SEND_RECEIVE,"CICSPROG");
6 JavaStringRecord jsr = new JavaStringRecord()
7
8 LocalTransaction tran = cxn.getLocalTransaction();
9 tran.begin();
10
11 jsr.setText("DATA1");
12 ixn.execute(ixnSpec, jsr, jsr);
13 ...
14 jsr.setText("DATA2");
15 ixn.execute(ixnSpec, jsr, jsr);
16 ...
17 tran.commit();
18 ixn.close();
19 cxn.close();
20

  当控制这样一组交互时,事务上下文对于 Connection 对象而言是本地的,因此对于基础的 ConnectionFactory 和它引用的 CICS 区域而言也是本地的。只要多个请求都在相同的 CICS 上启动,并通过相同的 CICS Transaction Gateway 访问,就可以对 CICS 发出多个请求。

  如果需要对多个资源管理器(如两个不同的 CICS 系统)进行更新,则需要全局事务上下文。这有必要使用 CICS ECI XA 资源适配器和 CICS Transaction Gateway V6.1 for z/OS。必须使用 Java Transaction API 和 UserTransaction 接口控制 BMT,该接口可以提供跨多个连接的必要 XA 事务支持(如果需要)。

1 try  {
2
3 Context ic = new InitialContext();
4 utx = (UserTransaction) ic.lookup("java:comp/UserTransaction");
5 cxfn = (ConnectionFactory) ic.lookup("java:comp/env/eis/ECICICS");
6
7 utx.begin();
8
9 Connection cxn= cxnf.getConnection();
10 Interaction ixn= cxn.createInteraction();
11 ECIInteractionSpec ixnSpec= new ECIInteractionSpec(SYNC_SEND_RECEIVE,"CICSPROG");
12 JavaStringRecord jsr = new JavaStringRecord()
13
14 jsr.setText("DATA1");
15 ixn.execute(ixnSpec, jsr, jsr);
16 ...
17 jsr.setText("DATA2");
18 ixn.execute(ixnSpec, jsr, jsr);
19
20 utx.commit();
21 ...
22 ixn.close();
23 cxn.close();
24 } catch (ResourceException re) {
25 try {
26 userTransaction.rollback();
27 }
28

  如何链接到发出 SYNCPOINT 命令的 CICS 程序?

  发出 SYNCPOINT 命令(带有或不带有回滚选项)的 CICS 程序不能从属于另一个事务管理器,因此它也不能成为扩展或全局事务的一部分。此事务管理器可以是发出 DPL 请求的另一个 CICS 系统,在我们的示例中是向 CICS ECI 资源适配器发送 CCI 请求的 WebSphere Application Server 事务管理器。此限制的原因是链接的程序在全局事务中是有效的资源管理器,并且只有事务管理器(初始调用方)可以控制事务协调。

  因此,要链接到发出 SYNCPOINT 命令的 CICS 程序,必须在 LINK 命令上指定 SYNCONRETURN;这意味着 CICS 服务器程序将在独立于客户机的本身的工作单元中运行。通过将 CICS ECI 资源适配器与 WebSphere Application Server 结合使用,可以动态地控制在 CCI 调用上使用 SYNCONRETURN 行为。对于来自 Web 容器中 Servlet 的调用,带有 SYNCONRETURN 的 LINK 是缺省的请求行为(请参见问题 1),而在 EJB 容器中,可以通过在 EJB 事务属性上定义非事务属性(如 Never)来利用容器,如表 2 所示。

  使用此 SYNCONRETURN 选项非常有用,因为通过远程事务管理器(在我们的示例中是 WebSphere Application Server)它可以从任何事务控制中释放 CICS 程序,并将事务的结果指派给 CICS。出于应用程序设计原因,这有时是非常必要的,只要 CICS 本身在管理所有可恢复的更新(如通过 CICS/DB2 或 CICS/VSAM 进行的更新),仍可以维护 CICS 中的事务完整性。

0
相关文章