1

2つのEJBがあります。Ejb-Bを呼び出すEjb-A。彼らは同じ耳にありません。

移植性のために、Ejb-Bは同じサーバー上に存在する場合と存在しない場合があります。(Ejb-BのプロバイダーURLを持つ外部プロパティファイルがあります。これを制御することはできません。)

コード例:Ejb-Aで

EjbBDelegate delegateB = EjbBDelegateHelper.getRemoteDelegate(); // lookup from list of URLs from props... 
BookOfMagic bom = delegateB.getSomethingInteresting();

ユースケース/結果

  1. Ejb-BがEjb-Aと同じサーバー上に存在しない場合、すべてが正しく機能します(URLを巡回します)
  2. Ejb-Bが同じサーバー上に存在し、 Ejb -Aがたまたま同じサーバー上でEjb-Bを呼び出す場合、すべてが正しく機能します。
  3. Ejb-Bが同じサーバー上に存在し、 Ejb -Aが別のサーバー上のEjb-Bを呼び出すと、次のようになります。

javax.ejb.EJBException:ネストされた例外は次のとおりです:java.lang.ClassCastException:$ Proxy126 java.lang.ClassCastException:$ Proxy126

Weblogic 10.0、Java 5、EJB3を使用しています

基本的に、Ejb-Bがサーバー上に存在する場合は、そのサーバー上でのみ呼び出す必要があります。

これにより、クラスがローカルクラスローダー(デプロイメント中?)によってロードされていると思います。リモートで呼び出されると、別のクラスローダーがクラスをロードします。(例外の原因)ただし、宛先クラスローダーにシリアル化される必要があるため、機能するはずです。

私は何が間違っているのですか?

また、これをローカルで再現する場合、Ejb-Aは同じサーバー上のEjb-Bを優先するため、再現が困難でした。しかし、これは他のマシンには当てはまりませんでした。

注:これはすべてEJB2で正しく機能しました

4

1 に答える 1

1

そのため、 @ RemoteHome(MyRemoteHome.class)をBeanに追加することで、この問題を「修正」することができました。

public interface MyRemoteMethods {
    String myMethod() throws RemoteException; // this Ex is required
}

public interface MyRemote extends EJBObject, MyRemoteMethods { 
}

public interface MyRemoteHome extends EJBHome {
    public MyRemote create() throws CreateException, RemoteException;
}

それから私の豆

...
@RemoteHome(MyRemoteHome.class)
public class MyBean implements MyRemoteMethods {
...

以前は、Beanとリモートインターフェイスのみが存在していました。(ローカルでの使用はありません)

全体として、この修正により、EJB3はもう少しEJB2っぽくなり、クリーンではなくなります(より多くのコードとクラスが含まれます)。また、ローカルサーバーとリモートサーバーからRemoteHomeインターフェイスのjndiルックアップを実行(およびcreateを呼び出す)してClassCastExceptionを取得できない理由もわかりませんが、リモートインターフェイスに対してこれを実行すると、ClassCastExceptionが発生します。これはWeblogicのバグですか?(JBossを使用した同様の投稿もいくつか見ました)

于 2010-06-22T18:30:01.547 に答える