我在努力弄清楚爲什麼我的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」 –