我正在工作的一个项目,由佩亚拉微动力,它是由一个domain.xml文件配置。
我面临着@Asynchronous注释的一个问题。
Oracle文档解释了这一点:
但是,调用异步方法的客户端将立即由企业bean容器返回给它们。 https://docs.oracle.com/javaee/7/tutorial/ejb-async001.htm
我的@Asynchronous注释方法不会立即返回。
@Path("foo")
public class FooResource {
@GET
public String get() {
System.out.println("Request started");
this.doSomething();
System.out.println("Request ended");
return "Hello world! ";
}
@Asynchronous
public void doSomething() {
try {
System.out.println("Long task started");
Thread.sleep(2000);
System.out.println("Long task ended");
} catch (InterruptedException e) {
System.out.println("Long task failed");
}
}
}在我看来,这应该会导致:
Request started
Long task started
Request ended
Long task ended但其结果是:
Request started
Long task started
Long task ended
Request ended我在Github上发布了一个简单的Gradle项目来再现行为这里。
发布于 2022-11-30 09:55:13
如果实际调用EJB的方法,则方法调用将是真正异步的。示例中的调用是一个本地方法调用,完全绕过容器及其注释处理。
正确的EJB调用将需要实际的EJB:
@Stateless
class MyEJB {
@Asynchronous
public void doSomething() {
try {
System.out.println("Long task started");
Thread.sleep(2000);
System.out.println("Long task ended");
} catch (InterruptedException e) {
System.out.println("Long task failed");
}
}
}..。以及资源类中的方法调用:
class MyResource {
@Inject MyEJB myEJB;
@Path("foo")
public class FooResource {
@GET
public String get() {
System.out.println("Request started");
myEJB.doSomething(); // <-- This is the important change!
System.out.println("Request ended");
return "Hello world! ";
}
}https://stackoverflow.com/questions/74625666
复制相似问题