1

私はこのようなインターフェースを持っています:

@Remote
public interface ClientDataAccessRemote

EJB はそれを実装します。

@Stateless
public class ClientDataAccess implements ClientDataAccessRemote 

リモート クライアントでは、次のようにして EJB にアクセスできます。

@EJB
private static ClientDataAccessRemote clientDataAccess;

これは私がやったことすべてであり、うまくいきます。クライアントと EJB は同じサーバー上にあります。別れたとしても、それは機能しますか?コンテナはどのようにしてそのインターフェースを持つ EJB を見つけるのでしょうか? これを Netbeans で実装したので、場所などを指定する必要はありませんでした。これはどのように作動しますか?

4

1 に答える 1

1

残念ながら、@EJB アノテーションはローカル (単一の JVM) インジェクションに対してのみ機能します。別のホストの場合は、プレーンな JNDI ルックアップにフォールバックする必要があります。

私の知る限り、WebLogicサーバー( here )のように、リモート依存性注入を実行するための独自の移植不可能なソリューションがいくつかありますが、私はそのようには行きません。

JNDI ルックアップは機能しますが、非常に複雑でかなり醜いです。

  • サーバー ベンダーを知り、そのクライアント ライブラリをアプリの依存関係に追加する必要があります。
  • アプリケーションを次のように汚染します。
    • 暗号化されたベンダー固有の URI 形式
    • ベンダー固有のネーミング サービスのポート番号 (多くの場合、デフォルトは 1099 ですが、確かなことは誰にもわかりません...)
    • ベンダー固有の jndi 名パターン

以下は、リモート JBoss 4.x インスタンスでホストされている Bean のルックアップの例です。

Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
    "org.jnp.interfaces.NamingContextFactory");
properties.put(Context.URL_PKG_PREFIXES,
    "org.jboss.naming:org.jnp.interfaces");
properties.setProperty(Context.PROVIDER_URL, "localhost:1099");
InitialContext context = null;
ClientDataAccessRemote cl = null;
try {
    context = new InitialContext(properties);
    cl = (ClientDataAccessRemote) context.lookup("ClientDataAccess/remote");
} catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

EJB が EAR の一部であることを考えると、EJBean の名前の前に EAR の名前を付ける必要があります。

cl = (ClientDataAccessRemote) context.lookup("MyEAR/ClientDataAccess/remote");

上記の例は JBoss 固有のものであり、修正なしで JBoss 5.x シリーズで動作するかどうかさえわかりません。

どうやら EJB 3.1 仕様は jndi の命名にいくらかの統一をもたらしたようですが、私はまだそれを扱う喜びを感じていません。

この例に少し不安を感じた場合は、EJB を Web サービス (SOAP または REST スタイル) として公開することをお勧めします。それ自体に問題がありますが、少なくとも移植可能です。

于 2013-03-03T14:09:16.290 に答える