2011-11-03 3 views
7

なぜ私の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(); 
    } 

} 
+0

JBoss AS 7(7.0.2現在)では@Asynchronousが実装されていないように見え始めていますが、Java EE 6の実装は仕様のリリース後もまだバグがあり不完全です。一口。警告や何かが黙って失敗することはありません。 –

+0

AS 7.0.2のスタンドアロンプ​​レビュー設定を使用して、一部のoff-by-default EJB3.1機能を有効にすることができます。 "bin/standalone.sh --server-config = standalone-preview.xml" –

答えて

9

JBossは、デフォルトでは@Asynchronousをサポートしていません。あなたはそれをオンにする必要があります。警告メッセージやエラーメッセージが表示されない場合、非同期メソッドは同期して実行されます。

これはユーザーフレンドリーです。

この*一応完成し、リリースされた製品で、これらの機能を有効にするには、例えば、「スタンドアロン・preview.xml」と7.0.2のJBoss ASを実行する必要があります:7.1(ベータAS

bin/standalone.sh --server-config=standalone-preview.xml 

かでを)またはそれ以降:

bin/standalone.sh --server-config=standalone-full.xml 

...非同期に呼び出されるメソッドを取得します...非同期に。

  • (確かにAS 7は、Java EE 6フルプロファイルのコンプライアンスを主張しませんが、警告がいいだろう!それとも既知の問題/穴のいくつかのドキュメント!何が、サイレント文書化されていない失敗...)

更新:garcia-jjが指摘したように、lite=truestandalone.xmlから削除すると、非同期EJBも機能します。

+0

AS 7.1では "standalone-preview.xml"が "standalone-full.xml"になりました –

+0

非同期EJBを有効にする方法スタンドアロンプ​​レビューを使用していますか?ありがとうございました。 –

+0

@ garcia-jj JBoss AS 7の新しいバージョンではstandalone-full.xmlと呼ばれますが、その点は同じです。非同期EJBを使用する場合は、非同期EJBをサポートするプロファイルでサーバーを実行する必要があります。あなたがそれを好きでない場合は、JBossに苦情を言います。なぜなら、これはあなたが現在持っている唯一のオプションだと思われるからです。 –

関連する問題