Java Timer定时器时,每次重复执行了两次任务的解决方案

web.xml监听配置

com.numenzq.mc.service.impl.TimerListener

TimerListener类
public class TimerListener implements ServletContextListener {
private Timer timer;
private TimerTaskSelf task;
/**
* @see 销毁
*/
@Override
public void contextDestroyed(ServletContextEvent arg0) {
timer.cancel();
}

/**
 * @see 创建
 */
@Override
public void contextInitialized(ServletContextEvent event) {
   timer = new java.util.Timer(true);
   task = new TimerTaskSelf(event.getServletContext());
   //执行任务指定间隔
   timer.scheduleAtFixedRate(task, 0, 1000*60*50);  
}

}

自定义任务类
package com.numenzq.mc.service.impl;

import java.util.Calendar;
import java.util.TimerTask;

import javax.servlet.ServletContext;

import org.apache.log4j.Logger;

public class TimerTaskSelf extends TimerTask {
private ServletContext context;
public TimerTaskSelf(ServletContext context){
this.context = context;
}
@Override
public void run() {
System.out.println(DateUtils.format(DateUtils.currentDate(),"yyyy-MM-dd HH:mm:ss") + " web监听结合定时器应用每次执行2次的问题...");
}
}

本地tomcat-7.0.12启动, 定时器执行没问题。
部署到服务器,linux,启动tomcat后,每次执行的时候会重复2次执行任务.

解决方案:

服务器上项目部署在tomcat的webapps文件下面,conf下的server.xml里面又配置了一句<Context .../> 指向tomcat的webapps下的项目,这样启动的时候web.xml里面的定时监听执行了2次.就是上面 那位哥哥说的 "先在contextInitialized里打印一下看看你的listern进去了几次" ,这样的情况会进去2次.

原文地址:https://www.cnblogs.com/cosiray/p/5294760.html