`
tian_cookie
  • 浏览: 44360 次
  • 性别: 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 入门使用文档

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

    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 ...

    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 Integration Server Ver集成组件.pdf

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

    webMethods公司简介.doc

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

    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