我的应用程序使用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时不应使用用户名/传递。)。
我认为这个实现的核心有问题 - 它应该如何正确完成?
答案 0 :(得分:0)
我不认为这是你问题的原因。两个InitialContexts都有不同的环境,它们都做不同的事情。你有java.naming.provider.url设置在其他地方吗?这些信息似乎不完整。
你需要在finally块中关闭这些上下文。