2017-10-02 13 views
1

でないEJBExceptionを扱う:私はEJB例外処理について読んでいると、これはこれまでのところ私の理解であるクライアントコード

は、トランザクション属性が必要なビーンB(サーバー)を想定します。

  • システム例外はあるべき呼び出し側にEJBExceptionとしてスローされます。
  • コンテナを持たないEJBException(または任意の他の未確認の例外)をインターセプトは、発信者がトランザクション内で実行されている場合、Beanインスタンスは破棄取得し、トランザクションがロールバックされます、発信者が包ま持たないEJBExceptionを取得し、それをラップし、発呼者
  • にそれをスローEJBTransactionRolledBackExceptionの内部にあります。
  • 呼び出し元がトランザクション内に存在しない場合、Beanインスタンスが破棄されると、呼び出し側はRemoteException内でラップされたEJBExceptionを取得します。

私はそれを呼び出し元トランスで実行します。属性が必須に設定されています。EJBExceptionがEJBTransactionRolledBackExceptionの内部にラップされています。

私はそれを呼び出し元のトランスで実行します。属性がNEVERに設定されていない場合、RemoteExceptionでラップされていない元のEJBExceptionを呼び出し元でキャッチします。

2番目のケースでRemoteExceptionが発生しません。

は、ここに私の発信者とサーバー豆の簡略図です:

@Stateless 
    public class BeanA implements BeanAInterface{ 

    @Override 
    public void callBeanB() { 

    BeanBInterface beanBInterface; 
    try{ 
    beanBInterface = (BeanBInterface) new InitialContext().lookup(BeanBInterface.class.getName()); 
    beanBInterface.getResponse(); 
    } catch (Exception e){ 
     log.error("Caught Exception: " + e); 
     } 
    } 
    } 




    @Stateless 
    public class BeanB implements BeanBInterface{ 

    @Override 
    public void getResponse(){ 

     throw EJBException("Catch me."); 

    } 
    } 

EDIT:

私はちょうど持たないEJBExceptionがリモートクライアントにローカルクライアントとはRemoteExceptionにスローされhereをお読みください。私の例の呼び出し側Beanは、サーバーBeanと同じサーバーインスタンスで実行されていますが、サーバーBeanのリモートインターフェイス経由で接続しています。リモートクライアントとリモートクライアントのどちらの定義も明確ではないと思いますが、リモートクライアントではないためRemoteExceptionが表示されないようです。

答えて

0

コンテナが実際にはローカルインタフェースではなくリモートを使用していることを確認してください。
あなたはあなたが参照している遠隔地ですので、あなたは遠隔地に電話していると思うかもしれませんが、実際にはコンテナはあなたがローカルであったように呼を処理するために「最適化」されています。

似たようなことに悩まされていたことを思い出しました.Jobossは、両方のEJBが同じVMにあったときに、Jbossがローカルコールとしてリモート呼び出しを処理していたことを認識しました。 私の場合、リモートインタフェースを使用していたときに、コンテナは値渡し(シリアル化されたオブジェクト)を使用していませんでしたが、参照を渡していました。

私のアドバイス:あなたが「遠隔シナリオ」にいることを確認してください。 2つの異なるアプリケーションサーバーを2つのjbosses iで使用して、何か変更があるかどうかを確認してください。

関連する問題