关于servlet中使用timer

demonapple 2011-10-25 09:32:45

import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class SetTimerExecute extends TimerTask implements
ServletContextListener {

private Timer t = new Timer();

public void contextDestroyed(ServletContextEvent arg0) {
// 服务器关闭时的动作
System.out.println("服务器停止");
t.cancel();
}

public void contextInitialized(ServletContextEvent arg0) {

// 服务器启动时的动作
System.out.println("服务器启动");
t.schedule(new SetTimerExecute(), 10000, 60 * 60 * 1000);
}

public void run() {

try {
System.out.println("自动执行方法");
} catch (Exception e) {
e.printStackTrace();
} finally {

}
}
}




使用定时器后,关闭tomcat时候总会报错
2011-10-25 9:33:21 org.apache.catalina.loader.WebappClassLoader clearReferencesT
hreads
严重: The web application [/jmail] appears to have started a thread named [Timer
-1] but has failed to stop it. This is very likely to create a memory leak.
2011-10-25 9:33:21 org.apache.coyote.http11.Http11AprProtocol destroy
信息: Stopping Coyote HTTP/1.1 on http-8888
2011-10-25 9:33:21 org.apache.coyote.ajp.AjpAprProtocol destroy
信息: Stopping Coyote AJP/1.3 on ajp-8009

请问 该如何修改代码 让tomcat能正常关闭?
关闭服务器的时候 我调用了 timer的cancel方法 但是不起作用
...全文
150 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙四 2011-10-25
  • 打赏
  • 举报
回复
应该是可以的,contextDestroyed方法被调用了么,这个方法的那几行字打印了么
zuxianghuang 2011-10-25
  • 打赏
  • 举报
回复
servlet是基于tomcat的,tomcat都关了,肯定有错
kaukiyou 2011-10-25
  • 打赏
  • 举报
回复
why use util.Timer?
why do not use javax.ejb.TimerService?
nizhicheng 2011-10-25
  • 打赏
  • 举报
回复
应该是又进程没挂掉~~~
试试
java.lang.Runtime
void addShutdownHook(Thread hook)
王二北 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wang12 的回复:]
更好的处理方式是:单独实现TimerTask的子类,单独实现contextlistener的监听器类。然后在contextListener监听器实例中创建一个实例字段来引用TimerTask实例,这样在destory时就不存在上面的哦错误
[/Quote]
同意该哥们的说法。
chaoxiaobudian 2011-10-25
  • 打赏
  • 举报
回复
把做任务的类,单独写一个。不要写到监听类里.
wang12 2011-10-25
  • 打赏
  • 举报
回复
更好的处理方式是:单独实现TimerTask的子类,单独实现contextlistener的监听器类。然后在contextListener监听器实例中创建一个实例字段来引用TimerTask实例,这样在destory时就不存在上面的哦错误
demonapple 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ticmy 的回复:]
应该是可以的,contextDestroyed方法被调用了么,这个方法的那几行字打印了么
[/Quote]

打印的

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧