6

2つのEARがデプロイされている単一のアプリケーションサーバーインスタンスを想定します。最初のEARは、リモートEJBインターフェースを使用して2番目のEARからEJBを呼び出します。

呼び出しがリモートインターフェイスを使用して実装されている場合でも、アプリケーションサーバーはすべてが同じJVM内にあることを認識し、ローカルインターフェイスメカニズムを備えたリモートインターフェイスを内部的に使用します。つまり、RMIを介してメソッドを呼び出さず、ソケットを開きません。 、およびオブジェクトをシリアル化/逆シリアル化しません。

これは本当ですか?この問題に関するWeblogic10.3.2およびOC4j10.1.3の動作についてフィードバックがあれば、よろしくお願いします。

4

1 に答える 1

1

いいえ、それは真実ではありません。ORBがローカルオブジェクトの最適化(「コロケーションされたオブジェクト」の場合もある)を実装している場合、ソケットは開かれませんが、シリアル化/逆シリアル化が実行されます。これは通常、マーシャリングよりも高速です。プログラミングモデルに違反しないように、余分なオブジェクトのコピーが作成されます。

生成されたスタブは、この最適化を可能にします。インターフェースの例を次に示します。

public interface a extends Remote {
  public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}

rmic -iiop-keepaの結果は次のとおりです。

public ArrayList test(ArrayList arg0, ArrayList arg1) throws java.rmi.RemoteException {
    if (!Util.isLocal(this)) {
        /* ... trim remote code ... */
    } else {
        ServantObject so = _servant_preinvoke("test",a.class);
        if (so == null) {
            return test(arg0, arg1);
        }
        try {
            Object[] copies = Util.copyObjects(new Object[]{arg0,arg1},_orb());
            ArrayList arg0Copy = (ArrayList) copies[0];
            ArrayList arg1Copy = (ArrayList) copies[1];
            ArrayList result = ((a)so.servant).test(arg0Copy, arg1Copy);
            return (ArrayList)Util.copyObject(result,_orb());
        } catch (Throwable ex) {
            Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
            throw Util.wrapException(exCopy);
        } finally {
            _servant_postinvoke(so);
        }
    }
}

スタブがローカルオブジェクトに接続されると、ObjectImpl._servant_preinvokeを呼び出して、同じJVM内でサーバント(この場合はEJBラッパー)を見つけます。次に、入力引数のコピーを作成し(マーシャリングをシミュレート)、メソッドを呼び出し、結果オブジェクトのコピーを作成します(ここでもマーシャリングをシミュレートします)。

私はWebLogicの専門家ではありません。とはいえ、このドキュメントは、WebLogicが併置されたオブジェクトの最適化を実行することを意味します。

http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328

于 2010-04-27T13:29:37.787 に答える