@Asynchronous не работает с более чем одним асинхронным методом в одном классе - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь использовать @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 голосов
/ 04 июля 2019

Я выясняю проблему.

Первый раз. Я устанавливаю ClassB как:

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

Это работает. Но позже я встретил другую проблему «javax.ejb.ConcurrentAccessTimeoutException: WFLYEJB0241: EJB 3.1 PFD2 4.8.5.5.1 тайм-аут одновременного доступа к QueryInfo - не удалось получить блокировку в пределах 5000MILLISECONDS», поэтому я изменяю @Singleton на @ConcurrencyManagement. Это @ConcurrencyManagement работает только для bean-компонента без сохранения состояния Поэтому @Stateless нужно добавить в ClassB.

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

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

Теперь работает.

...