二:如果更新的功能是纯数据的,那么,采用动态配置,避免重启动。比如,一个web系统,提供reloadConfig界面,重新从配置文件里读取数据。一个java应用程序,你可以在你的应用程序里启动一个检测线程,检测文件是否被改变,如果改变,则自动重新转载配置。如下例子:
public ConfigChecker extends Thread
{
SystemManager sm = null;
long time ;
public ConfigChecker(SystemManager sm) throws ApplicationException
{
this.sm = sm;
time = getConfigFileTime();
}
pulblic void run()
{
while(!interrupted())
{
try
{
long newTime = getConfigFileTime();
if(newTime!=time)
{
time = newTime;
//重新装载配置
sm.reloadConfig();
}
Thread.sleep(1000*3)
}
catch(Exception ex)
{
return ;
}
}
}
public long getConfigFileTime() throws ApplicationException
{
try
{
File f = new File(sm.getConfigFile());
return f.lastModified()
}
catch(IOException ex)
{
throw new ApplicationException(ex.getMessage())
}
}
}
这种方式适合你要动态改变的是纯数据,它要求你应用中的数据不能写死在代码里,而是通过文件配置。通过重新从配置文件里读取数据避免重启动
三:如果更新的功能包括应用逻辑,也就是class改变了,那就稍微麻烦点,你需要了解ClassLoader的原理。使用你定制的ClassLoader重新Load 已经编译好的class,就好比你重启应用一样。下面将简单介绍ClassLoader原理,以及举出一个例子来说明如何避免重启应用程序
虚拟机通过Classloader来装载类。bootstrap loader 负责load jdk的class(java.*,javax.*), system class loader是bootstrap的子类,负责load 所有在chasspath指定的变量。ClassLoader将字节流转化为Class类,这些字节流可能
↑返回目录
前一篇: java继承入门
后一篇: 《JAVA程序设计教程》电子教案