JNDI配置原理詳解

JNDI配置原理詳解

開發者在線 Builder.com.cn 更新時間:2007-12-17作者:雪峯 來源:雪峯的JavaEE博客

本文關鍵詞: 配置原理 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,他也不說用的哪個擴展包,我也懶得找了

發佈了28 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章