`
weifly
  • 浏览: 235933 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jetty中的JNDI实现分析

阅读更多

本文主要探讨jetty中的JNDI实现。

 

JNDI的入口类是javax.naming.InitialContext,其中的getURLOrDefaultInitCtx方法用于查找特定提供商的初始上下文对象,代码:

protected Context getURLOrDefaultInitCtx(String name) 
	throws NamingException {
	if (NamingManager.hasInitialContextFactoryBuilder()) {
		return getDefaultInitCtx();
	}
	String scheme = getURLScheme(name);
	if (scheme != null) {
		Context ctx = NamingManager.getURLContext(scheme, myProps);
		if (ctx != null) {
			return ctx;
		}
	}
	return getDefaultInitCtx();
}

如果name字符串是一个URL,则使用NamingManager.getURLContext方法获得指定的上下文,否则使用默认上下文。例如 java:comp/env就是一个URL形式的name,jdbc/mysql1就不是URL形式,必定会通过默认上下文查找。

 

如何确定上下文工厂?

InitialContext的javadoc中已经描述的很清除了

   1. 构造方法的环境参数、(适当属性的)applet 参数,以及系统属性中最先出现的属性。
   2. 应用程序资源文件 (jndi.properties)。 

Jetty中是通过jndi.properties资源文件来配置JNDI上下文工厂的,文件存放在jetty-jndi-7.4.0.v20110414.jar中,文件内容是:

java.naming.factory.url.pkgs=org.eclipse.jetty.jndi
java.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory

对于java:comp开头的name,使用org.eclipse.jetty.jndi.java.javaURLContextFactory来初始化上下文,对于其他类型的name,使用org.eclipse.jetty.jndi.InitialContextFactory。这两种初始化方法有不同的上下文根节点,是两颗上下文树。

 

默认根上下文存储在org.eclipse.jetty.jndi.local.localContextRoot类中,是一个静态变量。

java:开头的根上下文存储在org.eclipse.jetty.jndi.java.javaRootURLContext类中,是一个静态变量。

 

如何做到每个应用有私有的java:comp/env命名空间?

static{
	try{
		__javaNameParser = new javaNameParser();       
		__nameRoot = new NamingContext();
		__nameRoot.setNameParser(__javaNameParser);
		
		StringRefAddr parserAddr = new StringRefAddr("parser", __javaNameParser.getClass().getName());
            
		Reference ref = new Reference ("javax.naming.Context",
                                           parserAddr,
                                           ContextFactory.class.getName(),
                                           (String)null);

		//bind special object factory at comp
		__nameRoot.bind ("comp", ref);
	}
	catch (Exception e){
		__log.warn(e);
	}
}

 jetty在__nameRoot中绑定了一个名为comp的Reference类型的变量,这是一个引用。这个变量的工厂类是:org.eclipse.jetty.jndi.ContextFactory,这个类中基于classloader来创建上下文对象。因此在应用程序内部,使用InitialContext的lookup方法查找类似java:comp/env名称的对象时,将基于调用环境返回应用程序相关的上下文,也就是应用程序私有的上下文。

 

从localContextRoot类的名字也可以看出,jetty中的JNDI实现是本机JNDI实现,不支持跨JVM的远程对象查找。

IBM的websphere和Oracle的weblogic等服务器都支持远程对象查找,资源对象可以存放在一个JVM中,并在多个其他的JVM中使用这个资源。开源的JBoss服务器也支持远程对象查找。

我感觉远程JNDI的用处不多,主要查找的都是一些轻量级的服务对象,如:JMSContextProvider。

分享到:
评论

相关推荐

    Jetty嵌入式服务器的JNDI快速配置指南

    NULL 博文链接:https://seraph115.iteye.com/blog/436300

    jetty相关的全部jar包

    jar包版本9.4.8.v20171121,包含jetty-server-9.4.8.v20171121.jar,jetty-servlet-9.4.8.v20171121.jar,...jetty-annotations-9.4.8.v20171121.jarjetty-deploy-9.4.8.v20171121.jar,jetty-jndi-9.4.8.v20171121.jar

    jetty-jndi-9.2.15.v20160210.jar

    java运行依赖jar包

    jetty-jndi-7.6.10.v20130312.jar

    java运行依赖jar包

    Jetty中文手册

    在JNDI中配置数据源(DataSource) 内嵌Jetty服务器 内嵌Jetty教程 内嵌Jetty的HelloWorld教程 内嵌Jetty视频 优化Jetty 如何配置垃圾收集 如何配置以支持高负载 在Jetty中部署应用 部署管理器 部署绑定 热部署 ...

    jetty9分拆的各个包下载

    jetty-jndi-9.2.26.v20180806.jar jetty-plus-9.2.26.v20180806.jar jetty-proxy-9.2.26.v20180806.jar jetty-quickstart-9.2.26.v20180806.jar jetty-rewrite-9.2.26.v20180806.jar jetty-schemas-3.1.jar。。。。

    GeoServer开发手册系列

    配置Jetty的JNDI资源 19 Eclipse首选项 20 代码格式化 21 代码模板 22 文本编辑器 22 编译器 23 OWS服务 24 OWS服务概览 24 实现一个简单的OWS服务 24 建立 25 创建插件 27 试一试 30 REST服务 34 简介 34 RESTful...

    jetty-distribution-9.4.28.v20200408.zip

    Jetty提供了Web服务器和servlet容器的功能,还支持HTTP/2, WebSocket, OSGi, JMX, JNDI, JAAS 和很多其他模块。

    jetty中间件

    Eclipse Jetty provides a Web server and javax.servlet container, plus support for HTTP/2, WebSocket, OSGi, JMX, JNDI, JAAS and many other integrations. These components are open source and available ...

    jmeter测试相关jar包

    org.eclipse.jetty.jndi.source_9.1.1.v20140108.jar org.eclipse.jetty.osgi.boot_9.1.1.v20140108.jar org.eclipse.jetty.osgi.boot.jsp_9.1.1.v20140108.jar org.eclipse.jetty.osgi.boot.jsp.source_9.1.1.v...

    geoserver跨域处理包

    Geoserver安装方法的话,我是把 war 包放到到Tomcat目录下的webapp路径下,这里跨域设置针对war包的设置方式。

    ExampleJettyTest

    来救援Jetty 提供了一个 Web 服务器和 javax.servlet 容器,此外还支持 SPDY、Web Sockets、OSGi、JMX、JNDI、JASPI、AJP 和许多其他集成。 这些组件是开源的,可用于商业用途和分发。 Jetty 用于各种项目和产品。 ...

    Apache Geronimo 2.1_ Quick Reference.pdf

    Application local JNDI context 219 resource-ref 221 resource-env-ref 222 ejb-ref 222 ejb-local-ref 223 service-ref 224 message-destination-ref 225 persistence-context-ref 226 persistence-unit-...

    springboot参考指南

    在Spring环境中使用YAML暴露属性 iii. 23.6.3. Multi-profile YAML文档 iv. 23.6.4. YAML缺点 vii. 23.7. 类型安全的配置属性 i. 23.7.1. 第三方配置 ii. 23.7.2. 松散的绑定(Relaxed binding) iii. 23.7.3. @...

    spring-boot-reference.pdf

    Connection to a JNDI DataSource 29.2. Using JdbcTemplate 29.3. JPA and “Spring Data” 29.3.1. Entity Classes 29.3.2. Spring Data JPA Repositories 29.3.3. Creating and Dropping JPA Databases 29.3.4. ...

    Logback用户手册中文版

    目录 ..........................................................................................................................I 译者声明..................................................................

Global site tag (gtag.js) - Google Analytics