背景:被分配了一个将告警邮件整合,定时发送的任务。之前动不动就N封告警过来,现在改成1小时一封整合邮件。
过程:先是去百度了下java定时任务有哪些写法(最近翻墙因某种原因大量关闭)。
搜到了很多方法,因为需要改的项目使用的原生java代码,所以放弃了使用spring框架的方法。
任务比较简单,最后选了最简单的实现方法(Timer,TimerTask)。
内容:其实代码只要搬过来,实现自己定时运行的逻辑就好了,这里只是简单介绍下。
总共有3个部分:1.监听器(Listener) 2.定时任务管理器(TimerManager) 3.定时任务(TimerTask)
监听器的作用是用来触发定时任务管理器(毕竟是个javaweb项目);
定时任务管理器顾名思义就是管理各个定时任务的,主要是给定时任务分配一个启动时间,运行间隔等条件;
定时任务则是具体执行定时逻辑的地方了。
代码:
监听器省略了,就是在Listener的contextInitialized()方法里new个TimerManager对象
1.定时任务管理器
public class TimerManager {
// 时间间隔 1小时
private static final long PERIOD_HOUR = 60 * 60 * 1000;
public TimerManager() {
Calendar calendar = Calendar.getInstance();
// 这里设置下一个整点时间 是为了让服务启动后在下一个整点在执行第一次定时任务
// 下一个整点时间
calendar.set(Calendar.HOUR_OF_DAY, (calendar.get(Calendar.HOUR_OF_DAY) + 1));
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.MILLISECOND, 0);
// 第一次执行定时任务的时间
Date date = calendar.getTime();
Timer timer = new Timer();
TestTimerTask task = new TestTimerTask();
// 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(task, date, PERIOD_HOUR);
}
}
2.定时任务
public class TestTimerTask extends TimerTask {
public TestTimerTask() {
}
@Override
public void run() {
// ....具体实现逻辑的地方
}
}