jndi学习资料

原创 2007年10月11日 11:27:00

最近学EJB,看到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上:

import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.util.Date;

import javax.naming.Context;
import javax.naming.InitialContext;


public class JNDITest {
 static class RemoteDate extends Date implements Remote {
  public void print(){
   System.out.println("hello jndi!");
  }
 };
 public static void deploy()
 {
  try{
   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();
   ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
   ctx.close();
  }catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
  deploy();
  InitialContext ctx = new InitialContext();
  RemoteDate date=(RemoteDate)ctx.lookup("java:comp/env/systemStartTime");
  date.print();
 }catch(Exception e)
 {
  e.printStackTrace();
 }
}
}

注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了,否则,你又得写Hashtable env = ...

在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就自己扩展一个。

其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。

在后面的代码中查询就简单了:

InitialContext ctx = new InitialContext();
RemoteDate startTime = (RemoteDate ) ctx.lookup("java:comp/env/systemStartTime");

在SUN的JNDI tutorial中的例子用的com.sun.jndi.fscontext.RefFSContextFactory类,但是我死活在JDK 5中没有找到这个类,也就是NoClassDefFoundError,他也不说用的哪个扩展包,我也懒得找了。

java学习资料免费下载(持续更新ing)

持续更新java相关学习资料,供大家免费下载。主要是相关书籍,资料大部分来源于网络,本人仅收集整理,如有侵权,请联系我删除。 By zxiaofan.com 资料目录:http://blog....
  • u010887744
  • u010887744
  • 2017年01月25日 19:41
  • 5263

史上最全的机器学习资料(上)

摘要: 机器学习牵涉的编程语言十分之广,包括了MATLAB、Python、Clojure、Ruby等等。为了让开发者更加广泛、深入地了解机器学习,云栖社区组织翻译了GitHub Awesome Mac...
  • lipc_
  • lipc_
  • 2016年08月04日 17:18
  • 3428

jQuery学习资料分享

学习jQuery有一段时间了,收集了不少资料,这里把资料的链接分享给大家。另外推荐大家微博关注“开源中国”、“HTML5研究小组”、“百度技术沙龙”等,还有博客园的“梦想天空(山边小溪)”博客,我的很...
  • fanzhang1990
  • fanzhang1990
  • 2014年02月27日 15:37
  • 2153

JNDI参考资料.doc

  • 2011年06月12日 16:09
  • 172KB
  • 下载

jndi学习经典

  • 2013年11月18日 20:52
  • 751B
  • 下载

JNDI 网上学习探讨

  • 2012年02月28日 10:02
  • 44KB
  • 下载

JavaEE5学习笔记02-JNDI与RMI

  • 2011年05月16日 17:16
  • 263KB
  • 下载

servlet学习笔记_JNDI.doc

  • 2007年05月04日 23:02
  • 25KB
  • 下载

NDI学习总结 JNDI数据源的配置

NDI学习总结—JNDI数据源的配置
  • swebin
  • swebin
  • 2017年11月01日 16:30
  • 109

异步消息总线hornetq学习-02客户端连接hornet进行jms消息的收发-jndi方式连接

hornetq是将jms的核心组件以jndi的形式发布出来,因此客户端在调用时通过jndi查找对应的服务即可 以下步骤描述的是创建一个queue,一个生产者往queue里放消息,一个消费者从里面取...
  • CrazyCoder2010
  • CrazyCoder2010
  • 2012年10月13日 11:56
  • 2807
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jndi学习资料
举报原因:
原因补充:

(最多只允许输入30个字)