CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  应用服务器

大家好,我在WebLogic遇到了一个奇怪的类加载问题。Weblogic在没有重新加载整个应用的情况下,重新加载了一个类文件,但该类文件的时间戳

楼主shi_hang_nk(shi_hang_nk)2006-06-01 13:54:56 在 Web 开发 / 应用服务器 提问

大家好,我在WebLogic遇到了一个奇怪的类加载问题。Weblogic在没有重新加载整个应用的情况下,重新加载了一个类文件,但该类文件的时间戳没有变化。由于类实例中有只在第一次加载时初始化的静态数据成员,所以重新加载导致类实例中的数据成员被设为null,整个系统的运行都不正常。  
  我的开发环境为Windows2000   Server   +   WebLogic   8.1.4   +   Jrockit   1.4.2_05.  
  应用系统中有一个类叫做ConfigurationManager,其中有一个静态的数据成员parameters:  
   
  class   ConfigurationManager   {  
  …  
  private   static   HashMap   parameters   =   new   HashMap(); //   hashmap中存放着初始化参数  
  …  
   
  //   根据配置文件初始化hashmap  
  public   static   void   init(   String   configFileName)  
  {  
  ….   //   读取文件并初始化hashmap  
  }  
   
  //   JSP根据参数名从hashmap中取参数值  
  public   static   String   get(String   name)  
  {  
  return   (String   )   parameters.get(name);  
  }  
  }    
   
  在应用中有一个叫做InitialServlet的servlet类,它负责在weblogic加载应用时初始化ConfigurationManager。在web.xml中该servlet的load-on-startup属性为1,并有一个初始化属性为配置文件名。  
   
  public   class   InitialServlet   extends   HttpServlet   {  
   
          public   void   init(ServletConfig   servletconfig)   throws   ServletException   {  
                  super.init(servletconfig);  
                  String   cf   =   servletconfig.getInitParameter("ConfigFilePath");  
                  String   cfAbsolutePath   =   servletconfig.getServletContext().getRealPath(cf);  
                  try   {  
      //   根据参数文件初始化ConfigurationManager  
                      ConfigurationManager.init   (cfAbsolutePath);  
                  }  
                  catch   (Throwable   e)   {  
                      System.out.println(e.getMessage());  
                  }  
              }  
  }  
   
  当WebLogic加载应用后,InitialServlet初始化ConfigurationManager。JSP调用静态方法ConfigurationManager.get()   来取得所需要的参数。但是我们发现JSP刚开始能从get方法中取出参数,但正常运行一段时间(几个小时,也可能是十几分钟)后,调用就都返回null。重启WebLogic后又恢复正常。  
  经过如下方式,我发现WebLogic在没有重新加载整个应用、ConfiguraionManager.class时间戳也没有变化的情况下重新加载了ConfigurationManager.class。  
  我在ConfigurationManager中加了一段静态代码来打出加载时的堆栈:  
      static   {  
              try{  
                  throw   new   Exception("ConfigurationManager   is   loading….");  
              }catch(Exception   ex)  
              {  
  ex.printStackTrace();  
              }  
  }  
  在运行中我发现WebLogic将ConfigurationManager加载了二遍,第一遍是在WebLogic加载整个应用时,这时WebLogic根据web.xml中的定义先加载InitialServlet,在InitialServlet中加载并初始化ConfigurationManager,这是正确的;第二次却是在一个JSP页面来调用ConfigurationManager.get()时。  
  java.lang.Exception:   ConfigurationManager   is   loading...  
    at   com.fun.ConfigurationManager.<clinit>()V(ConfigurationManager.java:40)  
    at   jrockit.vm.RNI.getRunnableCode(I)I(Unknown   Source)  
    at   jrockit.vm.RNI.trampoline()V(Unknown   Source)  
    at   com.fun.ConfigurationManager.get()Ljava.lang.String;(ConfigurationManager.java:???)  
    at   jsp_servlet._report.__yzjcsylb._jspService(Ljavax.servlet.http.HttpServletRequest;Ljavax.servlet.http.HttpServletResponse;)V(__yzjcsylb.java:263)  
    at   weblogic.servlet.jsp.JspBase.service(Ljavax.servlet.ServletRequest;Ljavax.servlet.ServletResponse;)V(JspBase.java:33)  
  …..  
   
  这个系统还处于开发状态,开发人员会经常修改服务器上的JSP文件。但是InitialServlet、ConfigurationManager都放在WEB-INF\lib下一个单独的.jar中,而且该jar文件一直没有人修改。问题的关键就是Weblogic在没有重新加载整个应用的情况下,重新加载了一个类文件,但该类文件的时间戳没有变化。  
  我对WebLogic和Jrockit的类加载机制了解不多,不知有没有人遇到过类似问题,知道如何解决?多多感谢。  
  问题点数:20、回复次数:0Top

相关问题

关键词

得分解答快速导航

  • 帖主:shi_hang_nk

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo