なぜ私のEJBの@Asynchronousメソッドが実際に非同期に呼び出されていないのか分かりにくいです。私はJBoss AS 7で、Mavenが作成した単純な.warパッケージを使用してJSF2プロジェクトでCDI(beans.xml)を使用しています。@AsynchronousがJBossAS7のEJBメソッドの非同期呼び出しを引き起こさない
EJBは、対話するJSF2マネージドBeanとともに.warパッケージになっています。これは単純な@Stateless EJBです。 @Asynchronousメソッドを呼び出すJSF2マネージドBeanに(@Injectを介して)それを注入することによって使用されます。
未来を直ちに返す@Asynchronousメソッド呼び出しの代わりに、通常の非プロキシダイレクト呼び出しのように同期的に実行されます。これは、ローカル非インターフェイスビューまたはローカルビジネスインターフェイスを使用してEJBを呼び出すかどうかに関係なく適用されます。
@Asynchronousは@Remote beansでのみサポートされていますか?もしそうなら、それは.warパッケージ内で動作することができますか、この1つの機能を得るためにEARにEJB jarをパッケージ化する必要がありますか? .warで同じパッケージ内の各クラスでの例のために
簡体コード:7.0.2 AS
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();
}
}
JBoss AS 7(7.0.2現在)では@Asynchronousが実装されていないように見え始めていますが、Java EE 6の実装は仕様のリリース後もまだバグがあり不完全です。一口。警告や何かが黙って失敗することはありません。 –
AS 7.0.2のスタンドアロンプレビュー設定を使用して、一部のoff-by-default EJB3.1機能を有効にすることができます。 "bin/standalone.sh --server-config = standalone-preview.xml" –