在embed tomcat中使用jndi命名服务

在嵌入式的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

相关文章:

作者: flym

I am flym,the master of the site:)

发表评论

邮箱地址不会被公开。 必填项已用*标注