@ Асинхронный не приводит к асинхронному вызову метода EJB в JBossAS7 - PullRequest
7 голосов
/ 03 ноября 2011

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

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

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

@Asynchronous поддерживается только для bean-компонентов @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();
  }

}

1 Ответ

9 голосов
/ 03 ноября 2011

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-компонентов.

...