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

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

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

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

Поддерживается ли @Asynchronous только для @Remote beans? Если да, то может ли он работать в упаковке .war или мне нужно упаковать EJB jar в 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();
  }

}
7
задан casperOne 20 February 2012 в 06:36
поделиться