在嵌入式的tomcat中,默认是不开启命名服务支持的。如果要使用命名服务,按照官方的意思,只需要增加以下代码即可:
Tomcat tomcat = new Tomcat(); tomcat.enableNaming();
这样即可,但实际上,这个tomcat.enableNaming里面的东西太多。实际上,只需要增加以下代码即可:
System.setProperty("catalina.useNaming", "true");//开启命名服务支持 String value = "org.apache.naming"; System.setProperty(javax.naming.Context.URL_PKG_PREFIXES, value);//注册命名服务URL前缀
在如上的代码中,并不需要增加关于INITIAL_CONTEXT_FACTORY的设置,因为在访问资源时,如访问java:comp/env/jdbc/xx.tomcat只需要从URL_PKG_PREFIXES所在包下,寻找以URL_PKG_PREFIXES.java.javaURLContextFactory的类即可,而tomcat中有此类。并且查找的context是URLContext,而并不是InitialContext,因此其他的代码都是不需要的。
在具体的解析中,类StandardContext中进行启动时,只需要判断System.getProperty("catalina.useNaming")即可判断出是否启动命名上下文。如果启用命名服务,则会自动将NamingContextListener注册到监听器中,余下的工作就是监听器去完成了。详细的代码如下所示:(以下代码在类StandardContext中的startInternal方法内)
String useNamingProperty = System.getProperty("catalina.useNaming"); ...... if (ok && isUseNaming()) { if (getNamingContextListener() == null) { NamingContextListener ncl = new NamingContextListener(); ncl.setName(getNamingContextName()); addLifecycleListener(ncl); setNamingContextListener(ncl); } } //启动lifecycle,即刚注入的监听器,以及其他信息 fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null);
转载请标明出处:i flym
本文地址:https://www.iflym.com/index.php/code/201208080003.html