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");

这消除了错误,但仍然感觉很糟糕,因为其他一些参数会根据最后调用的方法不断变化(例如,在访问本地 ejb 时不应使用用户名/密码)。

我认为这个实现的核心有问题——它应该如何正确完成?

4

1 回答 1

0

我不认为这是你的问题的原因。两个 InitialContexts 都有不同的环境,它们都做不同的事情。您是否也在其他地方设置了 java.naming.provider.url ?信息似乎不完整。

您需要在 finally 块中关闭这些上下文。

于 2013-05-03T23:56:25.050 回答