timer的是单线程模式,执行中出现异常就会终止线程,其他任务也得不到执行。在jdk1.5之后出现ScheduledThreadPoolExecutor可以更好的替代timer.可参考:https://blog.csdn.net/qq_37160920/article/details/100688648
TimerTask:
使用javaUtil的TimerTask实现每天1点定时执行任务:
1.编写任务类,执行任务
package com.timerTask.controller;
import com.exception.AjaxException;
import com.timerTask.service.SyncUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.TimerTask;
public class SyncUserController extends TimerTask {
public Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private SyncUserService syncUserService;
@Override
public void run() {
try {
System.out.println("12312312312312s");
// syncUserService.syncUser();
}catch (Exception e){
logger.error("syncUserService.syncUser()同步用户异常:",e.getMessage());
throw new AjaxException(e);
}
}
}
2.编写timeManager,设置任务执行的时间
package com.timerTask;
import com.timerTask.controller.SyncUserController;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class TimerManager {
public static void main(String[] a){
new TimerManager();
}
//时间间隔(一天)
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
public TimerManager(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 1); //凌晨1点-HOUR_OF_DAY,24小时制
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date=calendar.getTime(); //第一次执行定时任务的时间
//如果第一次执行定时任务的时间 小于当前的时间
//此时要在 第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if (date.before(new Date())) {
date = this.addDay(date, 1);
}
Timer timer = new Timer();
SyncUserController task = new SyncUserController();
//安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(task,date,PERIOD_DAY);
}
// 增加或减少天数
public Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
}
3.设置监听,添加到web.xml中
package com.listener;
import com.timerTask.TimerManager;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class SyncUserListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
new TimerManager();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
<!--定时同步用户监听 start-->
<listener>
<listener-class>com.listener.SyncUserListener</listener-class>
</listener>
<!--定时同步用户监听 end-->