0
我的應用程序使用JNDI來訪問兩個本地EJB,並通過RMI訪問遠程服務。目前,這是通過以下方式處理:使用EJB和RMI處理多個jndi配置
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綁定時拋出多個異常。
我讀了你可以指定多個供應商的網址,所以我想在這兩種方法如下:
env.put(Context.PROVIDER_URL, "jnp://localhost:1099,ormi://server:port/APPNAME");
這消除了錯誤,但它仍然感覺不好,因爲一些其他參數的變化不斷地根據什麼方法被稱爲最後(當訪問本地ejbs時不應該使用用戶名/密碼)。
我認爲這個實現的核心有什麼問題 - 它應該如何正確完成?
但是initialcontexts共享環境,如果我使用提供者url創建一個新的InitialContext,它會將全局環境設置爲這個值,直到我創建一個新的覆蓋它爲止。這會導致未使用提供者url的用法出現問題,並且默認假定它。我自己不修改環境變量java.naming.provider.url。然而,它在另一個類的LDAP調用中使用,但我不認爲這在這裏有相關性。 – 2013-05-06 07:37:39