利用J2EE Connector Architecture(7)

    作者:课课家教育更新于: 2016-01-29 18:41:16

    大神带你学编程,欢迎选课

      部署到 web 容器

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

    利用J2EE Connector Architecture(7)_java敏捷开发_java网络开发_课课家

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

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

      Context ic = new InitialContext();

      cxfn = (ConnectionFactory) ic.lookup("java:comp/env/eis/ECICICS");

      Connection cxn= cxnf.getConnection();

      Interaction ixn= cxn.createInteraction();

      ECIInteractionSpec ixnSpec= new ECIInteractionSpec(SYNC_SEND_RECEIVE,"CICSPROG");

      JavaStringRecord jsr = new JavaStringRecord()

      jsr.setText("DATA1");

      ixn.execute(ixnSpec, jsr, jsr);

      ...

      jsr.setText("DATA2");

      ixn.execute(ixnSpec, jsr, jsr);

      ...

      ixn.close();

      cxn.close();

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

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

      Context ic = new InitialContext();

      cxfn = (ConnectionFactory) ic.lookup("java:comp/env/eis/ECICICS");

      Connection cxn= cxnf.getConnection();

      Interaction ixn= cxn.createInteraction();

      ECIInteractionSpec ixnSpec= new ECIInteractionSpec(SYNC_SEND_RECEIVE,"CICSPROG");

      JavaStringRecord jsr = new JavaStringRecord()

      LocalTransaction tran = cxn.gETLocalTransaction();

      tran.begin();

      jsr.setText("DATA1");

      ixn.execute(ixnSpec, jsr, jsr);

      ...

      jsr.setText("DATA2");

      ixn.execute(ixnSpec, jsr, jsr);

      ...

      tran.commit();

      ixn.close();

      cxn.close();

      当控制这样一组交互时,事务上下文对于 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 事务支持(如果需要)。

      try {

      Context ic = new InitialContext();

      utx = (UserTransaction) ic.lookup("java:comp/UserTransaction");

      cxfn = (ConnectionFactory) ic.lookup("java:comp/env/eis/ECICICS");

      utx.begin();

      Connection cxn= cxnf.getConnection();

      Interaction ixn= cxn.createInteraction();

      ECIInteractionSpec ixnSpec= new ECIInteractionSpec(SYNC_SEND_RECEIVE,"CICSPROG");

      JavaStringRecord jsr = new JavaStringRecord()

      jsr.setText("DATA1");

      ixn.execute(ixnSpec, jsr, jsr);

      ...

      jsr.setText("DATA2");

      ixn.execute(ixnSpec, jsr, jsr);

      utx.commit();

      ...

      ixn.close();

      cxn.close();

      } catch (ResourceException re) {

      try {

      userTransaction.rollback();

      }

课课家教育

未登录

1