1

実行時に ejb3 を呼び出したいと思います。ejb の名前とメソッド名は実行時にのみ使用できるため、コンパイル時にリモート インターフェイスを含めることはできません。

String bean = 'some/Bean';
String meth = 'doStuff';

//lookup the bean
Object remoteInterface = (Object) new InitialContext().lookup(bean);

//search the method ..
// foreach (methods)
// if method == meth, method.invoke(bean);

Bean は複数のアプリケーション サーバーに分散する必要があり、すべての Bean はリモートで呼び出される必要があります。

ヒントはありますか?特に私はしたくない

  1. 依存性注入
  2. ディスパッチャにアプリケーション固有の ejb インターフェイスを含める (上記)
  3. webservices、それは処理能力を無駄に捨てるようなもの、すべての xml がらくた

ネットワーク経由で ejb3 リモート インターフェースをロードすることは可能ですか (そうであれば、どのように?)、インターフェースをハッシュマップなどにキャッシュすることができます。

上記のメイン ディスパッチャーに含めることができるリモート ディスパッチャー Bean を使用したソリューションがありますが、これは本質的に同じことを行いますが、呼び出しをローカル ejb に中継するだけです (どのようにルックアップできますか? ネーミング ルックアップは失敗します)。リモート ディスパッチャ Bean があれば、依存性注入を使用できます。

助けてくれてありがとう

(ネットビーンズとグラスフィッシュところで)

4

4 に答える 4

1

ejb3 呼び出しは RMI を使用します。RMI はリモート クラスのロードをサポートしているので、それを調べることをお勧めします。

また、JMX mbeans は完全に型指定されていないリモート呼び出しをサポートしています。そのため、セッション Bean の代わりに MBean を使用できれば、うまくいく可能性があります。(たとえば、JBoss は、いくつかのカスタム アノテーションを持つ ejb3 のような mbeans をサポートします)。

最後に、多くのアプリ サーバーは CORBA 呼び出しをサポートしており、CORBA は型指定されていないメソッド呼び出しをサポートしています。

于 2008-11-09T05:58:25.710 に答える
0

リモートクラスのロードにjava.rmi.server.RMIClassLoaderを使用できる場合があります。また、リモートサービスが返すまたはスローするクラスをロードする必要があります。

于 2008-11-11T16:11:20.977 に答える
0

それはできません。「クラスが見つかりません」という例外が常に発生します。私の意見では、これが EJB/Java の最大の欠点です。メタ言語機能が制限されているため、ダイナミクスの一部が失われます。

EJB3 は RMI/IIOP をサポートしていますが、RMI/JRMP (標準 RMI) はサポートしていないため、動的なクラスのロードはサポートされていません。Java の一般性がいくらか失われますが、トランザクションやセキュリティについて通信できるなどの他の機能が得られます。

于 2009-01-16T12:04:12.737 に答える
0

これにはリフレクションを使用する必要があり、それを行うのは非常に簡単です。methという void メソッドを探しているとします。

Object ejb = ctx.lookup(bean);
for (Method m : ejb.getClass().getMethods()) {
    if (m.getName().equals(meth) && m.getParameterTypes().length == 0) {
        m.invoke(service);
    }
}

特定のメソッド シグネチャを探している場合は、それに応じて m.getParameterTypes() テストを変更するだけです。たとえば、単一の String パラメータを持つメソッドを試すことができます。

Arrays.equals(m.getParameterTypes(), new Class[]{String.class})

次に、実際の引数を含む Object[] 配列を m.invoke() 呼び出しに渡します。

m.invoke(service, new Object[]{"arg0"})
于 2009-01-20T14:55:07.767 に答える