我有以下情况:
- 客户端正在调用无状态本地 EJB - 托管事务从此调用开始
- 本地EJB构建InitialContext并查找远程EJB
- 本地 EJB 调用远程 EJB 上的方法
- 本地 EJB 关闭上下文以及与远程 EJB 的连接
- 容器尝试提交事务
无法提交分布式事务,因为无法联系到参与事务的远程 EJB,因为与该远程 EJB 的连接已关闭。
我的问题是:当已有事务处于事件状态时是否可以使用远程 EJB 调用?我应该如何关闭用于查找远程 EJB 的上下文?
以下伪代码说明了我的问题:
@Stateless
public class LocalEjb {
public void localEJBMethod() {
//transaction starts before this method execution
Context ctx = //create initial context
RemoteEjb remoteEjb = (RemoteEjb) ctx.lookup("jndi name");
remoteEjb.remoteMethod(); //remote EJB takes part in distributed transaction
ctx.close();
//error occurrs when container tries to commit distributed transaction after
//this method returns
}
}
public class ClientClass { //a CDI component, for example
@EJB
private LocalEjb localEjb;
public void clientMethod() {
localEjb.localEjbMethod();
}
}
最佳答案
该事务将起作用,因为应用程序服务器使用 XA(分布式)事务。
摆脱 ctx.close()
它实际上并没有关闭与远程 ejb(由动态代理对象处理)的连接,您正在关闭对 JNDI 上下文的访问,其中包含事务管理器的句柄。
还请记住,您需要让容器知道您正在使用另一个 EJB。所有容器管理的对象都需要向应用程序服务器声明其资源需求(ejb、数据源等)。在示例中,您会将声明放入 ejb-jar.xml 中。
您可能会考虑对远程 EJB 使用 @EJB 注释,而不是显式查找。这将向应用程序服务器声明资源使用情况,并为您管理引用。
关于jakarta-ee - 在托管事务期间关闭远程 EJB 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23544533/