下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

利用J2EE Connector Architecture(7)

作者:课课家教育     来源: http://www.kokojia.com点击数:715发布时间: 2016-01-29 18:41:16

标签: java敏捷开发java网络开发java学习课程

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

  部署到 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();

  }

赞(15)
踩(1)
分享到:
华为认证网络工程师 HCIE直播课视频教程