Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB异步调用未将控制权返回给调用方_Java_Asynchronous_Jboss - Fatal编程技术网

Java EJB异步调用未将控制权返回给调用方

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

我正在从另一个EJB调用异步EJB方法。 此方法的负载很重(数据库操作),因此它应该将控件返回给调用者,并在单独的线程中执行业务

根据API,这应该是实现的方法:

远程接口:

@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具有远程接口,也会从本地应用程序进行调用。也许这就是问题所在?