我在努力弄清楚为什么我的EJB中的@Asynchronous方法实际上不是异步调用的。我在JSF2项目中使用CDI(with beans.xml)在JBoss AS 7上运行,并使用Maven生成的简单.war包装。@Asynchronous不会导致异步调用JBossAS7中的EJB方法
EJB与JSF2托管的bean一起打包在.war中,并与之交互。这是一个简单的@Stateless EJB。通过将它注入(通过@Inject)到一个调用其@Asynchronous方法的JSF2托管bean中来使用它。
而不是@Asynchronous方法调用立即返回一个Future,它会同步执行,就好像它是一个普通的未调用的直接调用。无论我使用本地无界面视图还是本地业务界面来调用EJB,情况都是如此。
是@Asynchronous仅支持@Remote beans吗?如果是这样,它可以在.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();
}
}
它开始看起来像@Asynchronous没有在JBoss AS 7中实现(从7.0.2开始) - 再一次地,标志Java EE 6的实现在规范发布后仍然是bug和不完整的几年。叹。如果发出警告或某些不是SILENTLY FAIL,那将会很好。 –
您可以使用AS 7.0.2中的独立预览配置启用某些默认的EJB3.1功能。调用为:“bin/standalone.sh --server-config = standalone-preview.xml” –