参考:https://www.jianshu.com/p/db1611a16cb8
需求:在某个时间点一定时间后,定时执行任务
思路:
1.使用JDK自带Timer;
2.JDK1.5新增的ScheduledExecutorService;
3.使用Quartz(JAVA作业调度框架);
4.Spring3.0自带task
下面介绍自己使用第一种方法完成需求的过程,后三种方法未亲测,可移步参考链接了解
1.Timer类主要方法
该类允许调度一个java.util.TimerTask任务,主要方法如下
*schedule(TimerTask task, long delay) 延迟 delay 毫秒后,执行task
*schedule(TimerTask task, Date time) 在特定时间time执行task
*schedule(TimerTask task, long delay, long period) 延迟delay后执行task,并每隔period执行一次
2.JAVA代码
继承TimerTask类的TimerNotifyUtil,定时发送提醒消息类,提醒次日有预约的用户
import java.text.SimpleDateFormat;
import java.util.*;
public class TimerNotifyUtil extends TimerTask {
public void run() {
//获得次日日期
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE,1);
String tomorrow = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
//通过日期查询数据库预约记录
SQLUtil sUtil = new SQLUtil();
List<Map<String,String>> appNotify = sUtil.queryAppNotifyMap(tomorrow);
for (Map<String,String> temp: appNotify) {
//就每条需要发送提醒的记录调用发送提醒的方法
}
}
}
设置发送提醒消息的线程,定时启动TimerNotifyUtil
import com.dandelion.util.TimerNotifyUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class TimerNotifyThread implements Runnable {
//时间间隔
private static final long PERIOD_DAY = 24*60*60*1000;
public void run() {
log.info("进入定时发送咨询提醒功能!");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,20);
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类schedule方法定时循环执行
Timer timer = new Timer();timerNotifyUtil任务
TimerNotifyUtil timerNotifyUtil = new TimerNotifyUtil();
timer.schedule(timerNotifyUtil,date,PERIOD_DAY);
}
// 增加或减少天数
private Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
日暮汉宫传蜡烛,轻烟散入五侯家
网友评论