求大家指点下,关于timer初始化异常
项目遇到一个非常严重的问题,有个定时器timer被初始化了三次,然后执行了三次
可能因此造成了线程堵塞,然后服务器down了
弄了好久都无法解决,请大家指导下。
public class PackageAlertListener implements ServletContextListener{
private static Logger log = Logger.getRootLogger();
private java.util.Timer timer = null;
private AtomicBoolean done=new AtomicBoolean(false);
public void contextInitialized(ServletContextEvent sce) {
String path =ServletController1.class.getResource("/").getPath();
String websiteUrl = path.replace("/WEB-INF/classes","");
String filePath = websiteUrl + "files/log4j.properties";
PropertyConfigurator.configure(filePath);//Load log4j.properties file
if(done.get()){
return;
}
done.compareAndSet(false, true);
timer = new java.util.Timer(true);
log.debug(new java.util.Date() + "Timer start up!");这句话出现了三次,表明初始化了三次,但我已经用AtomicBoolean 锁住了,不知道为什么还是会初始化三次
String prefixAddress = sce.getServletContext().getInitParameter("prefixAddress");
timer.schedule(new PackageAlerTask(prefixAddress), 0, 1 * 60 * 1000);// 1 minute roll 因为每天都要在某个时候触发,所以回滚时间只能是一分钟
log.debug(new java.util.Date() + "Schedule loaded!");
}
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
log.debug(new java.util.Date() + "Timer destroyed!");
}
}
下面把timer具体代码也贴下
public class PackageAlerTask extends TimerTask {
private static Logger log = Logger.getRootLogger();
//每天触发时间
private static final int SCHEDULE_HOUR = 19;
private static final int SCHEDULE_MINUTE = 50;
private AtomicBoolean isRunning=new AtomicBoolean(false);
private String prefixAddress;
public PackageAlerTask(String prefixAddress) {
this.prefixAddress = prefixAddress;
}
public void run() {
if (!isRunning.get()) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
Date curDate = cal.getTime();
int curHour = cal.get(Calendar.HOUR_OF_DAY);
int curMinute = cal.get(Calendar.MINUTE);
if (SCHEDULE_HOUR == curHour && SCHEDULE_MINUTE == curMinute) {
isRunning.compareAndSet(false, true);
log.debug(new java.util.Date() + "task start");
doTask(curDate);
isRunning.compareAndSet(true, false);
} else {
log.debug(new java.util.Date() + "Task existed!");
}
}
public void doTask(curDate){
system.out.print(“触发器开始了”);这句话被打印了三次
...
}
我检查过日志,有的时候,初始化只有一次,但执行的时候,还是执行了三次。
所以我现在不知道究竟是初始化错误还是执行的时候异常。
麻烦大神帮忙分析下 --------------------编程问答-------------------- 异常贴上来 --------------------编程问答-------------------- 没有异常 就只看到初始化三次 运行三次
然后服务器突然没有任何异常信息的就挂了 --------------------编程问答-------------------- 有什么好的办法去控制让它只初始化一次吗 --------------------编程问答-------------------- 是不是加了3次易做图? --------------------编程问答--------------------
没有,配置文件里只配置了一次
我也不清楚为什么初始化了三次
补充:Java , Web 开发