`
tian_cookie
  • 浏览: 44284 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

webMethods IS源代码分析——ClassLoader

阅读更多
源起:开发了一个Package,这个Package用到了一个框架,该框架封装了log4J的日志功能,log4J初始化需要加载classpath下的log4j.properties,将这个properties文件到Package的code/classes下,或者config下均无法找到。

限制:不能跨越框架的封装直接调用log4J的初始化类来初始化log4J。

版本:webMethods IS 6.1, log4J 1.2.8

log4J在第一次调用LogManager的时候最始化,代码:
if(configurationOptionStr == null) {  
  url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
  if(url == null) {
    url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
  }
      } else {
  try {
    url = new URL(configurationOptionStr);
  } catch (MalformedURLException ex) {
    // so, resource is not a URL:
    // attempt to get the resource from the class path
    url = Loader.getResource(configurationOptionStr); 
  }  
}

这里的Loader是helpers下面的Loader类,getResource方法的代码如下:
static public URL getResource(String resource) {
    ClassLoader classLoader = null;
    URL url = null;
    
    try {
    if(!java1) {
      classLoader = getTCL();
      if(classLoader != null) {
        LogLog.debug("Trying to find ["+resource+"] using context classloader "
         +classLoader+".");
        url = classLoader.getResource(resource);      
        if(url != null) {
          return url;
        }
      }
    }
    
    // We could not find resource. Ler us now try with the
    // classloader that loaded this class.
    classLoader = Loader.class.getClassLoader(); 
    if(classLoader != null) {
      LogLog.debug("Trying to find ["+resource+"] using "+classLoader
             +" class loader.");
      url = classLoader.getResource(resource);
      if(url != null) {
        return url;
      }
    }
    } catch(Throwable t) {
    LogLog.warn(TSTR, t);
    }
    
    // Last ditch attempt: get the resource from the class path. It
    // may be the case that clazz was loaded by the Extentsion class
    // loader which the parent of the system class loader. Hence the
    // code below.
    LogLog.debug("Trying to find ["+resource+
         "] using ClassLoader.getSystemResource().");
    return ClassLoader.getSystemResource(resource);
  } 

大家可以看到,classLoader = Loader.class.getClassLoader(); 实际上log4J是调用当前类的ClassLoader来装载这个properties文件的。特别注意的是它使用的是getResource()方法,该方法返回一个URL类型的对象。

接下来看webMethods的ClassLoarder,webMethods IS有一个Server的ClassLoader,每一个Package有一个自己的ClassLoader,值得注意的是Package的ClassLoader与整个Server的ClassLoader没有继承关系,它们都是com.wm.app.b2b.server.ServerClassLoader的实例,这个类直接继承自JDK的ClassLoader,但是覆盖了父类的getResourceAsStream方法,代码如下:
public InputStream getResourceAsStream(String name)
    {
        for(int i = 0; i < resdirs.size(); i++)
        {
            File rfile = new File((File)resdirs.elementAt(i), name);
            if(rfile.exists())
                try
                {
                    return new FileInputStream(rfile);
                }
                catch(IOException _ex)
                {
                    JournalLogger.log(27, 28, name);
                }
        }

        for(int i = 0; i < jars.size(); i++)
            try
            {
                ZipFile zfile = new ZipFile((File)jars.elementAt(i));
                ZipEntry ze = zfile.getEntry(name);
                if(ze != null)
                {
                    InputStream is = null;
                    is = zfile.getInputStream(ze);
                    return is;
                }
            }
            catch(Exception _ex)
            {
                JournalLogger.log(26, 28, name);
            }

        for(int i = 0; i < cldirs.size(); i++)
        {
            File cfile = new File((File)cldirs.elementAt(i), name);
            if(cfile.exists())
                try
                {
                    return new FileInputStream(cfile);
                }
                catch(IOException _ex)
                {
                    JournalLogger.log(27, 28, name);
                }
        }

        return null;
    }

其中变量“resdirs”,“jars”,“cldirs”都是Vertor,通过下面的方法最始初化:
public static void addPackage(String pkgName)
        throws IOException, ZipException
    {
        Resources res = Server.getResources();
        ServerClassLoader scl = new ServerClassLoader(pkgName);
        scl.addJar(new File(res.getPackageCodeDir(pkgName), "classes.zip"));
        scl.addJarDir(res.getPackageJarsDir(pkgName));
        scl.addClassDir(res.getPackageClassDir(pkgName));
        scl.addResourceDir(res.getPackageResourceDir(pkgName));
        scl.addResourceDir(res.getDeprecatedPackageResourceDir(pkgName));
        pkgs.put(pkgName, scl);
    }

private void addResourceDir(File dir)
    {
        if(dir != null || dir.isDirectory())
            resdirs.addElement(dir);
    }

查看Resource类的代码发现放在Package的code/classes下,code/jars下,config下和lib下的文件都可以通getResourceAsStream这个方法取到。不知道什么原因,webMethods实现的ServerClassLoader并没有覆盖getResource方法,调用这个方法实际调用的是其父类即JDK的ClassLoader的方法。

问题就出在这里,当我在Package里用log4J的时候,log4J的实现是用getResource方法的,因此放在Package的资源文件下的properties文件无法被找到,只能将这个文件放到整个Server级别的classpath下。

影响:整个webMethods IS如果有多个包用自己的log4J,但却只能有一个log4J的配置。即使设置log4j.configuration这个属性,也只能有一个。
分享到:
评论
2 楼 Morgan0916 2006-11-07  
引用

接下来看webMethods的ClassLoarder,webMethods IS有一个Server的ClassLoader,每一个Package有一个自己的ClassLoader,值得注意的是Package的ClassLoader与整个Server的ClassLoader没有继承关系,它们都是com.wm.app.b2b.server.ServerClassLoader的实例,这个类直接继承自JDK的ClassLoader,但是覆盖了父类的getResourceAsStream方法,代码如下:


ClassLoader的父子关系和Classloader的实现类的继承关系是两回事的,或许你需要再研究一下是否有其他的设置!没有用过webMethods IS 6.1,也不知道此为何物.只是在Websphere Application Sever中,可以设置不同Classloader的加载策略. For example: PARENT_FIRST or PARENT_LAST.

还有,或许你可以DEBUG以下,看看当前的加载log4j LogManager的Classloder是那个? 它的查找路径有那些? 当前加载的log4j LogManager在那个位置?

1 楼 stone 2006-11-07  
关于webmethods的应用,不知道能否举个实际的用java调用的例子

相关推荐

    webMethods 912 IS管理手册

    This guide is for the administrator of a webMethods Integration Server. It provides an overview of how the server operates and explains common administrative tasks such as starting and stopping the ...

    webMethods8.0 IS

    ### webMethods 8.0 Integration Server (IS) 相关知识点 #### 一、概述 - **产品背景**:webMethods 8.0 IS(Integration Server)是Software AG推出的一款集成解决方案平台,主要应用于企业级应用程序集成(EAI...

    webMethods中文文档

    4. Elements:包含在Package中的各种组件,如服务、规范、IS文档类型、触发器和IS模式。 【常用控件与功能】 - Adapter Service:提供数据库操作支持,简化数据库连接设置。 - Trigger:支持订阅(publish-...

    webMethods8.0 Administering Broker

    webMethods Broker is the primary component in what is referred to as the “message backbone” in a webMethods integration environment. Along with other webMethods components, webMethods Broker ...

    webMethods Developer Guide

    webMethods Developer is a graphical development tool that you use to build edit and test integration logic It provides an integrated development environment in which you can develop the logic and ...

    WebMethods 入门使用文档

    - webMethods Developer:是集成开发环境,提供可视化建模、代码编写和部署工具。 - webMethods Glue:用于快速集成遗留系统、Web服务和业务流程。 - webMethods Fabric:是一个集成云服务和内部部署应用程序的平台...

    ASP.NET AJAX 服务器端 源代码

    服务器端源代码通常包含处理AJAX请求的PageMethods或WebMethods。这些是静态方法,可以直接从JavaScript调用,用于执行服务器端操作并返回结果。例如,你可以创建一个WebMethod来获取数据库数据,然后在客户端更新一...

    AJAX高级编程源代码

    **源代码分析** 源代码文件"ASP.NET 3.5 AJAX高级编程"可能包含了书中各个章节的示例代码,每个子目录或文件对应一个特定的AJAX技术或应用场景。通过查看和运行这些代码,读者可以更好地理解书中的概念,提升自己的...

    webmethods SAP Integration best practices

    在IT行业的深度探索中,"webmethods SAP Integration best practices"这一主题揭示了在SAP环境下,如何通过webMethods实现高效、稳定的企业级集成的最佳实践。本文将深入剖析这些最佳实践,帮助读者理解如何优化SAP...

    webMethods Adapter Development Kit Installation Guide

    ### webMethods Adapter Development Kit 安装指南知识点解析 #### 一、概述 《webMethods Adapter Development Kit Installation Guide》是一份详尽的文档,主要针对webMethods Adapter Development Kit 6.5版本...

    webMethods Developer Users Guide

    《webMethods Developer Users Guide》是针对webMethods Developer这一强大集成开发环境的一份详细用户指南。webMethods Developer是一款用于构建、测试和部署企业级业务流程集成解决方案的重要工具。它集成了多种...

    WebMethods Developer UsersGuide用户入门操作手册.pdf

    1. **WebMethods各个组件的介绍和功能**:手册中提及了webMethods软件套件中的多个组件,如webMethods Administrator(管理员)、webMethods Broker(经纪人)、webMethods Dashboard(仪表盘)、webMethods ...

    webmethods 6.5 安装手册 英文

    WebMethods是一款强大的集成平台,主要用于企业应用集成(EAI)和业务流程管理(BPM)。在WebMethods 6.5版本中,它提供了一个全面的工具集,用于连接不同的系统、自动化工作流程以及处理数据交换。以下是这个安装...

    WebMethods Flat File user guide

    在WebMethods的产品线中,包括了WebMethods Access、WebMethods Administrator、WebMethods Broker、WebMethods Dashboard、WebMethods Developer、WebMethods Fabric、WebMethods Glue、WebMethods Installer、...

    webMethods公司简介.doc

    1. 为企业决策者提供全面、正确、实时的业务信息:webMethods 的业务整合平台,可以轻易的从企业和合作伙伴的不同应用系统中采集丰富、有效、统一、实时的交易信息,通过提供对这些信息的处理,分析,可以为企业决策...

    WebMethods Integration Server Ver集成组件.pdf

    4. 文档中提及的webMethods Administrator、webMethods Broker等,可能是指WebMethods Integration Server中的不同模块或组件,各自承担不同的任务,比如管理、消息传递、用户界面展示等。 5. 文档提到的多个注册...

    EDI webmethods user Guide

    EDI webmethods user Guide Electronic Data Interchange,電子數據交換﹐是一種電子傳輸數據的方法﹐使用這種方法﹐將商業或行政事務處理中的報文數據按照公認的標准﹐形成結構化的報文數據格式﹐進而將這些結構化...

    webMethods 9.0 _ Mediator 详解

    webMethods 9.0 Mediator是软件AG旗下webMethods开发平台中的一个关键组件,用于实现服务集成和管理。通过本文,我们将详细介绍webMethods Mediator的功能和作用。 首先,webMethods Mediator是什么?webMethods ...

    webMethods8.0 TN Concepts

    webMethods Trading Networks also referred to as Trading Networks is a component that runs on the webMethods Integration Server Trading Networks enables your enterprise to link with other companies ...

Global site tag (gtag.js) - Google Analytics