@Asynchronous不适用于同一类中的多个异步方法

时间:2019-07-04 05:56:23

标签: asynchronous java-ee ejb

我正在尝试使用@Asynchronous执行业务。当我使用时:

ClassA {

  @Inject
  ClassB b; 

  public void runTest() {
     b.exec();
  }

}

@Named
@ConcurrencyManagement
@Startup
ClassB {
    @Asynchronous
    public void exec() {
    // codes here.
}
}

有效。但是如果ClassB更改为

@Named
@ConcurrencyManagement
@Startup
ClassB {
    @Asynchronous
    public void exec() {
    // codes here.
    }

    @Asynchronous
    public void exec1() {
    // codes here.
    }
}

ClassA更改为

ClassA {

  @Inject
  ClassB b; 

  public void runTest() {
     b.exec();
     b.exec1();
  }

}

exec()和exec1()没有异步运行。这是否意味着ClassB不能包含多个@Asynchronous方法?

我也将@Asynchronous移到了ClassB上,但是它仍然无法正常工作。我该怎么做才能使exec()和exec1()异步运行?

1 个答案:

答案 0 :(得分:0)

我发现了问题。

第一次。我将ClassB设置为:

@Named
@Singleton
@Startup
ClassB {
    @Asynchronous
    public void exec() {
    // codes here.
}
}

有效。但是后来我遇到了另一个问题“ javax.ejb.ConcurrentAccessTimeoutException:WFLYEJB0241:QueryInfo上的EJB 3.1 PFD2 4.8.5.5.1并发访问超时-无法在5000MILLISECONDS中获得锁定”,所以我将@Singleton更改为@ConcurrencyManagement。此@ConcurrencyManagement仅适用于无状态Bean。因此,需要将@Stateless添加到ClassB。

@Named
@ConcurrencyManagement
@Stateless
@Startup
ClassB {
    @Asynchronous
    public void exec() {
    // codes here.
    }

    @Asynchronous
    public void exec1() {
    // codes here.
    }
}

现在可以使用。