当前位置:编程学习 > JAVA >>

求大家指点下,关于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次监听器? --------------------编程问答--------------------
引用 4 楼 zssazrael 的回复:
是不是加了3次监听器?

没有,配置文件里只配置了一次
我也不清楚为什么初始化了三次
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,