2013-05-03 64 views
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時不應該使用用戶名/密碼)。

我認爲這個實現的核心有什麼問題 - 它應該如何正確完成?

回答

0

我不認爲這是你的問題的原因。兩個InitialContext都有獨立的環境,它們都做不同的事情。你還有其他地方設置了java.naming.provider.url嗎?信息似乎不完整。

您需要在finally塊中關閉這些上下文。

+0

但是initialcontexts共享環境,如果我使用提供者url創建一個新的InitialContext,它會將全局環境設置爲這個值,直到我創建一個新的覆蓋它爲止。這會導致未使用提供者url的用法出現問題,並且默認假定它。我自己不修改環境變量java.naming.provider.url。然而,它在另一個類的LDAP調用中使用,但我不認爲這在這裏有相關性。 – 2013-05-06 07:37:39