我正在努力弄清楚为什么我的 EJB 中的 @Asynchronous 方法实际上并没有被异步调用。我在 JSF2 项目中使用 CDI(使用 beans.xml)在 JBoss AS 7 上运行,并使用 Maven 生成的简单 .war 打包。
EJB 与与之交互的 JSF2 托管 bean 一起打包在 .war 中。这是一个简单的@Stateless EJB。通过将它(通过@Inject)注入到调用其@Asynchronous 方法的JSF2 托管bean 中来使用它。
@Asynchronous 方法调用不是立即返回 Future ,而是同步执行,就好像它是普通的无代理直接调用一样。无论我使用本地无接口视图还是本地业务接口来调用 EJB,这都是正确的。
@Asynchronous 是否仅支持 @Remote bean?如果是这样,它可以在 .war 打包中工作,还是我必须在 EAR 中打包一个 EJB jar 才能获得这一功能?
例如,为了简化代码,每个类都在 .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();
}
}