部署到 web 容器
在 Web 容器中部署的 Servlet 组件缺乏 EJB 组件的大多数事务属性。尽管如此,Web 容器还是支持 RMLT 和 LTC 容器策略,使用这两个策略可以影响 ECI 资源适配器发出的 JCA 请求。
在同一事务范围内,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();
}
¥29.00
¥299.00
¥399.00
¥498.00