JNDI學習資料

最近寫書,寫到JNDI,到處查資料,發現所有的中文資料都對JNDI解釋一通,配置代碼也是copy的,調了半天也沒調通,最後到SUN的網站參考了一下他的JNDI tutorial,終於基本上徹底明白了
和多數java服務一樣,SUN對JNDI也只提供接口,使用JNDI只需要用到JNDI接口而不必關心具體實現:
private static Object jndiLookup() throws Exception {
InitialContext ctx = new InitialContext();
return ctx.lookup("java:comp/env/systemStartTime");
}

上述代碼在J2EE服務器環境下工作得很好,但是在main()中就會報一個NoInitialContextException,許多文章會說你創建InitialContext的時候還要傳一個Hashtable或者Properties,像這樣:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,"t3://localhost:7001");
InitialContext ctx = new InitialContext(env);

這個在WebLogic環境下是對的,但是換到JBoss呢?再用JBoss的例子?
其 實之所以有NoInitialContextException是因爲無法從System.properties中獲得必要的JNDI參數,在服務器環境 下,服務器啓動時就把這些參數放到System.properties中了,於是直接new InitialContext()就搞定了,不要搞env那麼麻煩,搞了env你的代碼還無法移植,弄不好管理員設置服務器用的不是標準端口還照樣拋異 常。
但是在單機環境下,可沒有JNDI服務在運行,那就手動啓動一個JNDI服務。我在JDK 5的rt.jar中一共找到了4種SUN自帶的JNDI實現:
LDAP,CORBA,RMI,DNS。
這4種JNDI要正常運行還需要底層的相應服務。一般我們沒有LDAP或CORBA服務器,也就無法啓動這兩種JNDI服務,DNS用於查域名的,以後再研究,唯一可以在main()中啓動的就是基於RMI的JNDI服務。
現在我們就在main()中啓動基於RMI的JNDI服務並且綁一個Date對象到JNDI上:
LocateRegistry.createRegistry(1099);
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
InitialContext ctx = new InitialContext();
class RemoteDate extends Date implements Remote {};
ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
ctx.close();

注意,我直接把JNDI的相關參數放入了System.properties中,這樣,後面的代碼如果要查JNDI,直接new InitialContext()就可以了,否則,你又得寫Hashtable env = ...
在RMI中綁JNDI的限制是,綁定的對象必須是Remote類型,所以就自己擴展一個。
其實JNDI還有兩個Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果訪問JNDI需要用戶名和口令,這兩個也要提供,不過一般用不上。
在後面的代碼中查詢就簡單了:
InitialContext ctx = new InitialContext();
Date startTime = (Date) ctx.lookup("java:comp/env/systemStartTime");

在SUN 的JNDI tutorial中的例子用的com.sun.jndi.fscontext.RefFSContextFactory類,但是我死活在JDK 5中沒有找到這個類,也就是NoClassDefFoundError,他也不說用的哪個擴展包,我也懶得找了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章