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