首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Payara @异步而非异步

Payara @异步而非异步
EN

Stack Overflow用户
提问于 2022-11-30 09:47:17
回答 1查看 9关注 0票数 0

我正在工作的一个项目,由佩亚拉微动力,它是由一个domain.xml文件配置。

我面临着@Asynchronous注释的一个问题。

Oracle文档解释了这一点:

但是,调用异步方法的客户端将立即由企业bean容器返回给它们。 https://docs.oracle.com/javaee/7/tutorial/ejb-async001.htm

我的@Asynchronous注释方法不会立即返回。

代码语言:javascript
复制
@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");
    }
  }
}

在我看来,这应该会导致:

代码语言:javascript
复制
Request started
Long task started
Request ended
Long task ended

但其结果是:

代码语言:javascript
复制
Request started
Long task started
Long task ended
Request ended

我在Github上发布了一个简单的Gradle项目来再现行为这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-30 09:55:13

如果实际调用EJB的方法,则方法调用将是真正异步的。示例中的调用是一个本地方法调用,完全绕过容器及其注释处理。

正确的EJB调用将需要实际的EJB:

代码语言:javascript
复制
@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");
    }
  }
}

..。以及资源类中的方法调用:

代码语言:javascript
复制
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! ";
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74625666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档