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




