使用EJB和RMI处理多个jndi配置

时间:2013-05-03 14:20:17

标签: rmi jndi jboss5.x

我的应用程序使用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时不应使用用户名/传递。)。

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

1 个答案:

答案 0 :(得分:0)

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

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