0

私のアプリケーションは、JNDI を使用してローカル EJB にアクセスし、RMI を介してリモート サービスにアクセスします。現在、これは次の方法で処理されます。

public MyLocalEJB getMyLocalEJB(){
    Hashtable<String, String> env = new Hashtable<String, String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"));
    env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
    env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"));

    InitialContext ctx = new InitialContext(environment);
    return (MyLocalEJB)ctx.lookup("MyEar/MyBean/local");
}

public RemoteServiceInterface getRemoveService(){
    Hashtable<String, String> env = new Hashtable<String, String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.evermind.server.ApplicationClientInitialContextFactory"));
    env.put(Context.PROVIDER_URL, "ormi://server:port/APPNAME");
    env.put(Context.SECURITY_PRINCIPAL, "user");
    env.put(Context.SECURITY_CREDENTIALS, "secret");

    InitialContext ctx = new InitialContext(environment);
    return (RemoteServiceInterface)ctx.lookup("ejb/service/RemoteService");
}

Context.PROVIDER_URL が java.naming.provider.url をオーバーライドし、プロパティを前後に変更してからタイミングの問題が発生するため、これはいくつかの問題を引き起こすようです。たとえば、Hibernate Sessionfactory は、ローカルの代わりに RMI プロバイダーの URL を取得すると、プロバイダーの URL が間違っているという警告をスローし、JBoss はシャットダウン時に jndi バインディングに関する複数の例外をスローします。

複数のプロバイダー URL を指定できると読んだので、両方の方法で次のことを試しました。

env.put(Context.PROVIDER_URL, "jnp://localhost:1099,ormi://server:port/APPNAME");

これによりエラーは解消されますが、最後に呼び出されたメソッドに応じて他のパラメーターが常に変化するため、まだ気分が悪いです (たとえば、ローカル ejbs にアクセスするときにユーザー名/パスを使用しないでください)。

この実装の核心に何か問題があると思います - どうすれば適切に行われるのでしょうか?

4

1 に答える 1

0

これがあなたの問題の原因ではないと思います。両方の InitialContext には別々の環境があり、どちらも異なることを行います。java.naming.provider.url も別の場所に設定していますか? 情報が不完全なようです。

finally ブロックで、これらのコンテキストを閉じる必要があります。

于 2013-05-03T23:56:25.050 に答える