- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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 中的例子用的c
文档评论(0)