Я изо всех сил пытаюсь выяснить, почему @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();
}
}