当前位置: 代码迷 >> J2EE >> Tomcat重启后,之前的过程会完全关闭么
  详细解决方案

Tomcat重启后,之前的过程会完全关闭么

热度:356   发布时间:2016-04-17 23:41:15.0
Tomcat重启后,之前的进程会完全关闭么?
这两天在工作中遇到一个问题想请教各位大神!

项目里每次重启的时候会扫描数据库然后新建一些计时器Timer,这些计算器自动倒计时去完成一些任务。假如我在Tomcat运行中修改了配置文件,并且重启了Tomcat。按道理之前的Timer都会被取消掉,Tomcat重启的时候会创建新的Timer。

有没一种可能就是当我修改Tomcat里面的配置,Tomcat自动reload,之前的Timer没有被完全取消,而且还创建了新Timer。

------解决思路----------------------
这个问题应该是存在的,你可以实际测试一下。另外,下面是一个reload出现重复进程的的解决机制:

我觉得任何线程都应该有一个退出机制,例如:
public void run()
{
while(flag)
{
try
{
work();
Thread.sleep(6000);
}catch(Exception e){}
}
}

在servlet的destroy方法里
设置flag=false就可以让线程退出。 

在tomcat中可以注册ServletContextListener,这是一个标准的机制。

public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServletContextEvent sce);

允许程序在系统启动和关闭的时候作一些工作。我把线程的启动和关闭都放在这里了,这样系统在reload的时候,也会调用ServletContextListener的方法。
------解决思路----------------------
这个方法不错,要主动停止服务器时把当前内存的状态记录下来,比如把定时器的值写入到一个临时文件中保存,每次服务器重启之后检查这个文件是否存在,有的话就恢复出来并删除临时文件,如果没有的话重新开始计数。如果像是停电这种意外关机一般也不考虑吧(当然也可以每次更新计数器的值时都同步到这个临时文件中备份一下)。

引用:
好速度啊!!我先看看理解下!非常感谢!!

Quote: 引用:

这个问题应该是存在的,你可以实际测试一下。另外,下面是一个reload出现重复进程的的解决机制:

我觉得任何线程都应该有一个退出机制,例如:
public void run()
{
while(flag)
{
try
{
work();
Thread.sleep(6000);
}catch(Exception e){}
}
}

在servlet的destroy方法里
设置flag=false就可以让线程退出。 

在tomcat中可以注册ServletContextListener,这是一个标准的机制。

public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServletContextEvent sce);

允许程序在系统启动和关闭的时候作一些工作。我把线程的启动和关闭都放在这里了,这样系统在reload的时候,也会调用ServletContextListener的方法。
  相关解决方案