2017-01-31 6 views
1

他のEJBから非同期EJBメソッドを呼び出しています。 このメソッドは負荷が重いため(データベース操作)、呼び出し元に制御を戻し、分離されたスレッドでビジネスを行う必要があります。EJB非同期呼び出しが呼び出し元に制御を戻しません

APIによると、これはそれを行うための方法のようになります。

リモートインターフェース:

@Remote 
public interface MyEJBRemote { 

    @Asynchronous 
    void myMethod() throws RuntimeException; 
} 

EJBクラス:

@LocalBean 
@Stateless 
@TransactionAttribute(TransactionAttributeType.NEVER) 
public class MyEJB implements MyEJBRemote { 

    @Override 
    public void myMethod() throws RuntimeException { 
     //for testing 
     while (true){ 
      Thread.sleep(5000); 
      logger.info("Running asynchronous method"); 
     } 
     //Method code here 
    } 
} 

発信者コード:

@LocalBean 
@Stateless 
@TransactionAttribute(TransactionAttributeType.NEVER) 
public class MyEJBCaller { 

    @EJB 
    private MyEJB myEJB; 

    public void request() throws RuntimeException { 
     logger.info("Begin"); 
     myEJB.myMethod(); 
     logger.info("End"); 
    } 
} 

テスト用私は非同期メソッド内に無限ループを作成しました。 理論上、ログは「開始」 - 「終了」 - 「非同期メソッドの実行」と表示されるはずですが、「終了」に達することはありません。

私に何か不足していますか?なぜメソッドへの呼び出しが呼び出し側に制御を返さないのですか?

私はJBoss EAP 6.4サーバーを使用しています。それはサーバー側の構成上の問題になりますか?

答えて

0

は、問題を考え出したていないが、他の誰かが同じ問題を抱えている場合、私は解決策を得た:リモートインタフェースからの注釈を削除し、EJB自体にそれらを置きます。

インタフェース:

@Remote 
public interface MyEJBRemote { 

    void myMethod() throws RuntimeException; 
} 

EJB:

@LocalBean 
@Stateless 
@TransactionAttribute(TransactionAttributeType.NEVER) 
public class MyEJB implements MyEJBRemote { 

    @Override 
    @Asynchronous 
    public void myMethod() throws RuntimeException { 
     //for testing 
     while (true){ 
      Thread.sleep(5000); 
      logger.info("Running asynchronous method"); 
     } 
     //Method code here 
    } 
} 

、発信者:

@LocalBean 
@Stateless 
@TransactionAttribute(TransactionAttributeType.NEVER) 
public class MyEJBCaller { 

    @EJB 
    private MyEJB myEJB; 

    public void request() throws RuntimeException { 
     logger.info("Begin"); 
     myEJB.myMethod(); 
     logger.info("End"); 
    } 
} 

Asynchronous用APIでの検索は、ターゲットがMETHODのいずれかになりますようですまたはTYPEであるため、理論的には注釈はインターファーce。しかし、別のローカルEJBから呼び出しが行われた場合、JVMはインタフェースではなくクラスからのみ解決します(実行時にアノテーションが解決されるため)

ローカル・インタフェースを作成してみました。同じ結果ですので、実際にはローカル呼び出しでEJBメソッド自体にアノテーションを定義する必要があるようです。

EDIT:EJBはインターフェイスからアノテーションを継承しないという問題があります。これは多重継承の問題を避けるためのようです。

0

ejbインターフェイスを挿入する必要があります。

@LocalBean 
@Stateless 
@TransactionAttribute(TransactionAttributeType.NEVER) 
public class MyEJBCaller { 

    @EJB 
    private MyEJBRemote myEJB; 

    public void request() throws RuntimeException { 
     logger.info("Begin"); 
     myEJB.myMethod(); 
     logger.info("End"); 
    } 
} 
+0

ありがとうございました! それを試しましたが、私はまだ同じ結果を得ています。 EJBにリモートインタフェースがある場合でも、ローカルアプリケーションから呼び出しが行われます。多分それは問題ですか? – Arkaitz

関連する問題