| 发表于:2007-10-05 22:13:27 楼主 |
jboss或其它javaee服务器的jndi名称空间分为几大类: 1.全局(本机或其它机器都可通过网络访问这个名称空间里面的东东,对命名没有要求); 2.本jvm能访问的(以java:/开头,只能在同一个jvm内访问); 3.java:/cmp(只能在本组件内部访问,比如发布此jndi资源的本web程序内部) 上述分类是我google了很多资源后对常用服务器的jndi分类的一个理解。(不知是否正确),为了验证我的理解,我在jboss里面同时部署了2个web应用a.war,b.war,在这2个web应用里面使用同样的代码列出jndi树,代码如下: enumeration i1 = new initialcontext().listbindings(""); // global namespace enumeration i2 =new initialcontext().listbindings("java:/"); // java namespace (same vm only) enumeration i3 =new initialcontext().listbindings("java:/comp"); // component names enumeration i4 =new initialcontext().listbindings("java:/comp/env"); // enc logger.info("global context "); for (; i1.hasmoreelements();) logger.info(i1.nextelement()); logger.info("context java:/"); for (; i2.hasmoreelements();) logger.info(i2.nextelement()); logger.info("context java:/comp/"); for (; i3.hasmoreelements();) logger.info(i3.nextelement()); logger.info("context java:/comp/env/"); for (; i4.hasmoreelements();) logger.info(i4.nextelement()); 通过比较a.war和b.war 打印出的日志,我发现二者打印出的全局名称空间包含的内容是一致的,java:/这个名称空间的内容是一致的。a.war的java:/comp内容如下: usertransaction: javax.naming.linkref:reference class name: javax.naming.linkref type: linkaddress content: usertransaction 2007-09-28 15:50:53,440 info [attachweb] env: org.jnp.interfaces.namingcontext:org.jnp.interfaces.namingcontext@7e942f b.war的java:/comp内容如下: usertransaction: javax.naming.linkref:reference class name: javax.naming.linkref type: linkaddress content: usertransaction 2007-09-28 15:51:25,368 info [syn_cen] env: org.jnp.interfaces.namingcontext:org.jnp.interfaces.namingcontext@626028 发现分别从a.war,b.war中访问并列出java:/comp的内容是不同的。我发现的矛盾是:在整个jndi空间内,a.war,b.war的java:/comp是同一个吗?至少它们都属于java:/这个父亲空间,而同一个父亲空间(这里是java:/)怎么可能包括2个同名的java:/comp子空间呢?如果a.war,b.war的java:/comp是同一个,为何打印出来的内容又不一样? 在应用服务器的jndi空间里,java:/comp是组件(包括web,ejb)的私有空间,是为了起到隔离各组件名称空间的作用,只要是在各组件私有空间绑定的资源,即使名字和其它组件私有空间的名称相同也不会引起冲突。那么从a.war,b.war里面lookup ("java:/comp")的时候,jndi服务器怎样区分呢属于不同组件的java:/comp呢?jndi树到底是怎样组织的? |
|
|
|
|