@Asynchronous не приводит к асинхронному вызову метода EJB в JBossAS7

Я изо всех сил пытаюсь понять, почему метод @Asynchronous в моем EJB на самом деле не вызывается асинхронно. Я использую JBoss AS 7, используя CDI (с beans.xml) в проекте JSF2 с простой упаковкой .war, созданной Maven.

Компонент EJB упакован в файл .war вместе с взаимодействующими с ним управляемыми компонентами JSF2. Это простой EJB @Stateless. Он используется путем внедрения его (через @Inject) в управляемый компонент JSF2, который вызывает свой метод @Asynchronous.

Вместо того, чтобы вызов метода @Asynchronous немедленно возвращал Future, он выполняется синхронно, как если бы это был обычный прямой вызов без прокси. Это справедливо независимо от того, использую ли я локальное представление без интерфейса или локальный бизнес-интерфейс для вызова EJB.

Поддерживается ли @Asynchronous только для компонентов @Remote? Если да, то может ли он работать в упаковке .war или мне нужно упаковать банку EJB в EAR только для того, чтобы получить эту функцию?

Упрощенный код, например, с каждым классом в одном пакете в .war:

public interface SomeEJB {
  public Future<Void> doSomething();
}

@Stateless
@Local(SomeEJB.class)
public class SomeEJBImpl implements SomeEJB {

  @Asynchronous
  @Override
  public Future<Void> doSomething() {
    // Spend a while doing work
    // then:
    return new AsyncResult<Void>(null);
  }

}

@Named
@RequestScoped
public class JSFBean {

  @Inject private transient SomeEJB someEJB;
  private Future<Void> progress;

  // Called from JSF2, starts work and re-displays page
  public String startWorkAction() {
    // This call SHOULD return a Future immediately. Instead it blocks
    // until doWork() completes.
    progress = someEJB.doWork();
  }

  public Boolean isDone() {
    return progress != null && progress.isDone();
  }

}

person Craig Ringer    schedule 03.11.2011    source источник
comment
Похоже, что @Asynchronous не реализован в JBoss AS 7 (по состоянию на 7.0.2) — и снова признаки того, что реализации Java EE 6 все еще содержат ошибки и не завершены спустя годы после выпуска спецификации. Вздох. Было бы неплохо выдать предупреждение или что-то не SILENTLY FAIL.   -  person Craig Ringer    schedule 03.11.2011
comment
Вы можете включить некоторые функции EJB3.1, не включенные по умолчанию, с помощью конфигурации автономного предварительного просмотра в AS 7.0.2. Вызовите как: bin/standalone.sh --server-config=standalone-preview.xml   -  person Craig Ringer    schedule 03.11.2011


Ответы (1)


JBoss AS 7.0.2 по умолчанию не поддерживает @Asynchronous. Вы должны включить его. Если он не включен, нет предупреждений или сообщений об ошибках, асинхронные методы просто выполняются синхронно.

Да, это удобно.

Чтобы включить эти функции в этом предположительно законченном и выпущенном* продукте, вы должны запустить JBoss AS 7.0.2 с "standalone-preview.xml", например:

bin/standalone.sh --server-config=standalone-preview.xml

или в AS 7.1 (бета) или более поздней версии:

bin/standalone.sh --server-config=standalone-full.xml

... который вызывает асинхронные методы ... асинхронно.

  • (По общему признанию, AS 7 не претендует на соответствие полному профилю Java EE 6, но предупреждение было бы неплохо! Или какая-нибудь документация по известным проблемам/дырам! Что угодно, но не тихий недокументированный сбой...)

Обновление: как заметил garcia-jj, удаление lite=true из standalone.xml также заставит работать асинхронные EJB.

person Craig Ringer    schedule 03.11.2011
comment
Обратите внимание, что в AS 7.1 файл standalone-preview.xml теперь называется standalone-full.xml. - person Craig Ringer; 13.12.2011
comment
Как включить асинхронный EJB без использования автономного предварительного просмотра? Спасибо. - person Otávio Garcia; 12.02.2012
comment
@garcia-jj Теперь он называется standalone-full.xml в более новых версиях JBoss AS 7, но суть та же: вы должны запустить сервер с профилем, поддерживающим асинхронные EJB, если вы хотите использовать асинхронные EJB. Если вам это не нравится, пожалуйтесь JBoss, потому что, похоже, это единственный вариант, который у вас есть прямо сейчас. - person Craig Ringer; 15.02.2012
comment
Я нашел другое решение: удалить атрибут lite=true из urn:jboss:domain:ejb3:1.1 в standalone.xml. - person Otávio Garcia; 05.03.2012
comment
@ garcia-jj Чем это отличается от использования standalone-full.xml ? Есть идеи, какие функции активны в standalone-full.xml, которые не активируются lite=false ? - person Craig Ringer; 06.03.2012