`

论context.lookup

    博客分类:
  • Java
阅读更多

最近在OC4J 10g引用了weblogic10的jar包时,发现Local对象无法获取,总是报javax.naming.NameNotFoundException,于是分析了一下context.lookup是如何执行的。


在获取Local bean时,所用语句如下:

final InitialContext context = new InitialContext();
       String jndiName = "java:comp/env/ejb/BusinessLocal";
       Object object = context.lookup(jndiName  );

 

解析new InitialContext();

new InitialContext()à

myProps = ResourceManager.getInitialEnvironment(environment); à

String[] jndiSysProps = helper.getJndiProperties();à

System.getProperties();

myProps的值为:

{java.naming.factory.initial=com.evermind.server.ApplicationInitialContextFactory,

java.naming.factory.url.pkgs=oracle.oc4j.naming.url:weblogic.jndi.factories:weblogic.corba.j2ee.naming.url}

 

解析context.lookup(jndiName  );

context.lookup(jndiName  ) à

context.getURLOrDefaultInitCtx(String name); à

NamingManager.getURLContext(scheme, myProps); à

NamingManager.getURLObject(scheme, null, null, null, environment); à

ResourceManager.getFactory(

             Context.URL_PKG_PREFIXES, environment, nameCtx,

             "."+scheme+"."+scheme+"URLContextFactory",defaultPkgPrefix); 

 

分析ResourceManager.getFactory()源码

public static Object getFactory(String propName, Hashtable env,
                   Context ctx, String classSuffix, String defaultPkgPrefix)
                   throws NamingException {
         // Merge property with provider property and supplied default
        //从env获取java.naming.factory.url.pkgs的值
         String facProp = getProperty(propName, env, ctx, true);
         if (facProp != null)
                   facProp += (":" + defaultPkgPrefix); //注意在此时加上了默认的sun的com.sun.jndi.url
         else
                   facProp = defaultPkgPrefix;
 
         // Cache factory based on context class loader, class name, and
         // property val
         ClassLoader loader = helper.getContextClassLoader(); //此时loader为simple.root:0.0.0
 
         String key = classSuffix + " " + facProp;
 
         Map perLoaderCache = null;
         synchronized (urlFactoryCache) {
                   perLoaderCache = (Map) urlFactoryCache.get(loader);
                   if (perLoaderCache == null) {//第一次perLoaderCache为null
                            perLoaderCache = new HashMap(11);
                            urlFactoryCache.put(loader, perLoaderCache);
                   }
         }
 
         synchronized (perLoaderCache) {
                   Object factory = null;
 
                   WeakReference factoryRef = (WeakReference) perLoaderCache.get(key);
                   if (factoryRef == NO_FACTORY) {
                            return null;
                   } else if (factoryRef != null) {//第一次factoryRef为null
                            factory = factoryRef.get();
                            if (factory != null) { // check if weak ref has been cleared
                                     return factory;
                            }
                   }
 
                   // Not cached; find first factory and cache
                   StringTokenizer parser = new StringTokenizer(facProp, ":");
                   String className;
                   while (factory == null && parser.hasMoreTokens()) {
                            className = parser.nextToken() + classSuffix;
                            /* 这里className 的值分别为
    oracle.oc4j.naming.url.java.javaURLContextFactory
    weblogic.jndi.factories.java.javaURLContextFactory
    weblogic.corba.j2ee.naming.url.java.javaURLContextFactory
    com.sun.jndi.url.java.javaURLContextFactory */
                            try {
                                     // System.out.println("loading " + className);
                                     factory = helper.loadClass(className, loader).newInstance();
                            } catch (InstantiationException e) {
                                     //略
                            } catch (IllegalAccessException e) {
                                     //略
                            } catch (Exception e) {
                                     // ignore ClassNotFoundException, IllegalArgumentException,
                                     // etc.
                            }
                   }
 
                   // Cache it.
                   perLoaderCache.put(key, (factory != null) ? new WeakReference(
                                     factory) : NO_FACTORY);
                   return factory;
         }
}
 

最后factory.getObjectInstance(urlInfo, name, nameCtx, environment);

 

当不加载weblogicjar包时,

java.naming.factory.url.pkgs=oracle.oc4j.naming.url

className=oracle.oc4j.naming.url.java.javaURLContextFactory,返回的factory=null,所以最终使用的Factorycom.sun.jndi.url.java.javaURLContextFactory,这个时候没有问题

 

当加载weblogicjar包时,

java.naming.factory.url.pkgs=

oracle.oc4j.naming.url:

weblogic.jndi.factories:

weblogic.corba.j2ee.naming.url

使用的Factory

weblogic.jndi.factories.java.javaURLContextFactory

     而在获取Local bean时抛出javax.naming.NameNotFoundException

 

分享到:
评论

相关推荐

    Tomcat连接池配置方法详解 源代码 JSP context.xml

    DataSource ds = (DataSource)initCtx.lookup("java:comp/env/myoracle"); ``` 这里的`java:comp/env/myoracle`是JNDI(Java Naming and Directory Interface)路径,`myoracle`对应`context.xml`中的`name`属性。 ...

    数据池连接Name jdbc is not bound in this Context解决方案

    import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import java.sql.Connection; // 获取初始上下文 Context ctx = new InitialContext(); // 查找环境上下文 ...

    dns-lookup-cache:通过避免线程池并为特定主机名使用DNS TTL缓存来加速nodejs“ dns.lookup”方法的实现

    dns-lookup- dns.lookup替换dns.lookup标准方法的DNS缓存 超级简单易用 const request = require ( 'request' ) ; const { lookup } = require ( 'dns-lookup-cache' ) ; // With "request" module request ( { url...

    cacheable-lookup:尊重TTL的可缓存dns.lookup(…)

    使用lookup选项 const http = require ( 'http' ) ; const CacheableLookup = require ( 'cacheable-lookup' ) ; const cacheable = new CacheableLookup ( ) ; http . get ( 'http://example.com' , { lookup : ...

    lookup-dns-cache:通过避免线程池并为特定主机名使用DNS TTL缓存来加速nodejs`dns.lookup`方法的实现

    lookup-dns- dns.lookup替换dns.lookup标准方法的DNS缓存超级简单易用const request = require ( 'request' ) ;const { lookup } = require ( 'lookup-dns-cache' ) ;// With "request" modulerequest ( { url : '...

    axios-cached-dns-resolve:使用异步dns.resolve代替同步dns.lookup,可选缓存和定期后台刷新

    Axios使用node.js dns.lookup解析主机名。 dns.lookup是同步的,并且在有限的libuv线程池上执行。 每个axios请求都将解析kubernetes,openshift和云环境中的dns名称,这些dns名称是故意将TTL设置为低或设置为0以...

    JMS开发例子.pdf

    import javax.naming.Context; import javax.naming.InitialContext; public class QueueSend { public static void main(String[] args) { try { // 创建JNDI上下文 Hashtable, String> properties = new ...

    requestUtils lookup方法简介

    requestUtils lookup方法简介

    http接口需要的jar包

    资源包含两个jar包,一个是httpclient,一个是httpcore. http接口需要的jar包,可以查看博客:https://blog.csdn.net/qq_25814003/article/details/80749287

    Delphi中ADOQuery使用了lookup字段后出现未知错误解决

    ADOQuery添加了lookup字段后使用Append,再为字段赋值时会报错“EOleException 未知错误”,很困扰啊,终于能解决了。

    geoip-lookup:获取有关 IP 地址的位置信息

    geoip-lookup 公开 2 个简单的 API, .lookup和.match 。 两者都是异步的,但.match将“阻止”回调,直到它检索到信息。 如果数据没有缓存在 LevelUp 本地数据库中,一旦数据被检索, .lookup将返回一个未定义的...

    运行Phoenixclient所需架包-包含报错所需架包.7z

    运行Phoenixclient所需架包-包含报错所需架包,文章:Phoenix API Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/config/Lookup所需要资源

    RevitLookup-2020.0.0.4.zip

    RevitLookup是一款强大的Revit插件,主要用于Revit模型的检查、分析和调试。这款工具在Revit二次开发领域有着广泛的应用,可以帮助开发者和设计师深入理解Revit模型的数据结构,提高工作效率。RevitLookup-2020.0....

    NC开发文档

    (Accsubjdoc) NCLocator.getInstance().lookup(Accsubjdoc.class.getName()); nc.vo.bd.b02.AccsubjVO[] targetSubjVos = itf.queryAccsubjVOs(pk_glorgbook, null, false); AccperiodVO //查询会计期间 AccperiodVO...

    Java EJB简单例子.rar

     Object ref = jndiContext.lookup("HelloWorldHome");  HelloWorldHome home = (HelloWorldHome)  PortableRemoteObject.narrow (ref, HelloWorldHome.class);  //用EJB生成库Home生成EJB对象  HelloWorld...

    MyEclipse链接oracle连接池的创建

    import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; public class Connect { public static Connection getconnect() { Connection cn = null; try { System.out...

    【含源码和addin】RevitLookup 2020

    用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2019下即可。(如果不能正常使用,请用Visual Studio打开源码,将项目所需的引用更新到正确的路径,编译生成RevitLookup.dll...

    RevitLookup-2017.0.0.5

    RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5

    RevitLookup-2021.0.0.13

    RevitLookup是一款强大的Revit插件,主要用于Revit二次开发中的调试和分析工具。它能够帮助用户在Revit环境中深入洞察模型元素的属性和结构,从而更好地理解和优化BIM(建筑信息模型)项目。RevitLookup-2021.0.0.13...

    RevitLookup.dll

    编译的基于revit2017的lookup工具,帮助更好的开发revit插件。 RevitLookUp工具可以帮助我们调试Revit数据库,并能够辅助我们理解和查找元素以及它们的参数。但是网站上只有源码需要自己编译。

Global site tag (gtag.js) - Google Analytics