Java EJB异步调用未将控制权返回给调用方
我正在从另一个EJB调用异步EJB方法。 此方法的负载很重(数据库操作),因此它应该将控件返回给调用者,并在单独的线程中执行业务 根据API,这应该是实现的方法: 远程接口:Java EJB异步调用未将控制权返回给调用方,java,asynchronous,jboss,Java,Asynchronous,Jboss,我正在从另一个EJB调用异步EJB方法。 此方法的负载很重(数据库操作),因此它应该将控件返回给调用者,并在单独的线程中执行业务 根据API,这应该是实现的方法: 远程接口: @Remote public interface MyEJBRemote { @Asynchronous void myMethod() throws RuntimeException; } @Remote public interface MyEJBRemote { void myMetho
@Remote
public interface MyEJBRemote {
@Asynchronous
void myMethod() throws RuntimeException;
}
@Remote
public interface MyEJBRemote {
void myMethod() throws RuntimeException;
}
EJB类:
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJB implements MyEJBRemote {
@Override
public void myMethod() throws RuntimeException {
//for testing
while (true){
Thread.sleep(5000);
logger.info("Running asynchronous method");
}
//Method code here
}
}
呼叫方代码:
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJBCaller {
@EJB
private MyEJB myEJB;
public void request() throws RuntimeException {
logger.info("Begin");
myEJB.myMethod();
logger.info("End");
}
}
出于测试目的,我在异步方法中创建了一个无限循环。
理论上,日志中应该出现“开始”-“结束”-“运行异步方法”
但它从未到达“终点”
我错过了什么?为什么对方法的调用不将控件返回给调用方
我使用的是JBoss EAP 6.4服务器。这可能是服务器端的配置问题吗?您应该使用ejb接口进行注入
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJBCaller {
@EJB
private MyEJBRemote myEJB;
public void request() throws RuntimeException {
logger.info("Begin");
myEJB.myMethod();
logger.info("End");
}
}
您应该使用ejb接口进行注入
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJBCaller {
@EJB
private MyEJBRemote myEJB;
public void request() throws RuntimeException {
logger.info("Begin");
myEJB.myMethod();
logger.info("End");
}
}
我没有解决这个问题,但是如果其他人也有同样的问题,我得到了一个解决方案:从远程接口删除注释,并将它们放在EJB本身中 界面:
@Remote
public interface MyEJBRemote {
@Asynchronous
void myMethod() throws RuntimeException;
}
@Remote
public interface MyEJBRemote {
void myMethod() throws RuntimeException;
}
EJB:
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJB implements MyEJBRemote {
@Override
@Asynchronous
public void myMethod() throws RuntimeException {
//for testing
while (true){
Thread.sleep(5000);
logger.info("Running asynchronous method");
}
//Method code here
}
}
呼叫者:
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJBCaller {
@EJB
private MyEJB myEJB;
public void request() throws RuntimeException {
logger.info("Begin");
myEJB.myMethod();
logger.info("End");
}
}
在API中搜索似乎目标可以是方法或方法,因此理论上可以在接口中声明注释。但是,如果调用是从另一个本地EJB发出的,JVM可能只从类而不是从接口解析它(因为注释是在运行时解析的)
还尝试创建一个本地接口(而不是远程接口)并得到了相同的结果,因此本地调用似乎确实需要在EJB方法本身中定义注释
EDIT:问题是EJB没有从接口继承注释。这似乎是为了避免多重继承问题没有解决这个问题,但是如果其他人也有同样的问题,我得到了一个解决方案:从远程接口删除注释,并将它们放在EJB本身中 界面:
@Remote
public interface MyEJBRemote {
@Asynchronous
void myMethod() throws RuntimeException;
}
@Remote
public interface MyEJBRemote {
void myMethod() throws RuntimeException;
}
EJB:
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJB implements MyEJBRemote {
@Override
@Asynchronous
public void myMethod() throws RuntimeException {
//for testing
while (true){
Thread.sleep(5000);
logger.info("Running asynchronous method");
}
//Method code here
}
}
呼叫者:
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEJBCaller {
@EJB
private MyEJB myEJB;
public void request() throws RuntimeException {
logger.info("Begin");
myEJB.myMethod();
logger.info("End");
}
}
在API中搜索似乎目标可以是方法或方法,因此理论上可以在接口中声明注释。但是,如果调用是从另一个本地EJB发出的,JVM可能只从类而不是从接口解析它(因为注释是在运行时解析的)
还尝试创建一个本地接口(而不是远程接口)并得到了相同的结果,因此本地调用似乎确实需要在EJB方法本身中定义注释
EDIT:问题是EJB没有从接口继承注释。这似乎是为了避免多重继承问题谢谢您的回复!我试过了,但还是得到了同样的结果。即使EJB具有远程接口,也会从本地应用程序进行调用。也许这就是问题所在?谢谢你的回复!我试过了,但还是得到了同样的结果。即使EJB具有远程接口,也会从本地应用程序进行调用。也许这就是问题所在?