我的应用程序使用 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 时不应使用用户名/密码)。
我认为这个实现的核心有问题——它应该如何正确完成?