3

EJB クライアント アプリケーションがアプリケーション サーバーとの接続を失ったときに発生する特定のケースの例外ハンドラーを作成したいと考えています。私たちが作成しているコードは、フェイルオーバー環境で同じサーバーまたは別のサーバーへの再接続を試行するユーザー フレンドリーな方法でクライアント アプリケーションを処理できます。「接続を失う」とは、再接続が必要なものを意味します。原因としては、ネットワークの問題、サーバーのロックアップ、サービスのダウンなどが考えられます。

これが私たちが探しているもののアイデアです(クライアントコード):

private void doSomething() throws RecoverableException {
//(...)
BusinessRemoteEJB ejb=ctx.lookup("BusinessRemoteEJB");

try {
    List<product> list=ejb.getProducts();
    //(...)
} catch (EJBException e){
 Exception e = e.getCausedByException();

 //Here is what I'm looking for: some excpetion that indicates a connection problem
 if(e !=null && e instanceof EJBConnectionException){

     //This will be catched in a proper place to try to reconnect
     throw new RecoverableException(e);
 } else {
 //If it is any other excpetion, just let it work up the stack
 throw e;

}

もちろんEJBConnectionExceptionは存在しません。そのようなものはありますか?

OpenEJB 1.4 (EJB 3.x 準拠) を使用しています。ただし、可能であれば、異なるアプリケーション サーバー間で使用できる例外ハンドラーを使用したいと考えています。

もう 1 つのことは、一部のアプリケーション サーバーは何らかのフェイルオーバー メカニズムを提供することですが、私たちの要件は少し特殊であり、クライアント コードに直接実装することができます。

4

1 に答える 1

7

@Remoteも実装するインターフェースでjava.rmi.Remoteは、例外処理がわずかに変更されます。つまり、インターフェイス内のすべてのメソッドで を宣言する必要がありますjava.rmi.RemoteException。これにより、クライアントは接続関連の問題を受け取ることができます。が存在しない場合java.rmi.Remote、コンテナはそのようなすべての問題を EJBException に変換します。EJBException であること以外の要件はないため、EJBException の原因またはサブクラスに依存することは移植できません。

@Remote
public interface OrangeRemote extends java.rmi.Remote {

    public void doSomething() throws RemoteException;
}

@Stateless
public class OrangeBean implements OrangeRemote {

    @Override
    public void doSomething() {
        //...
    }
}

Bean 自体はRemoteExceptionthrows 句で宣言する必要がないことに注意してください。Java では、インターフェースを実装するときに例外のサブセットを宣言できますが、EJB はそれを変更しません。Bean 自体から RemoteException をスローすると、ポイント全体が無効になるため、除外することをお勧めします。

于 2011-06-02T19:21:58.193 に答える