package com.yytx.cloud.qa.manager.timer;
import com.alibaba.fastjson.JSON;
import com.yytx.cloud.common.qa.entity.QaTaskEntity;
import com.yytx.cloud.common.redis.service.RedisCache;
import com.yytx.cloud.qa.manager.task.controller.QaTaskController;
import com.yytx.cloud.qa.manager.task.dao.MaTaskDao;
import com.yytx.cloud.qa.manager.task.service.MaTaskService;
import com.yytx.cloud.qa.manager.task.vo.QaTaskQueryParam;
import com.yytx.cloud.qa.manager.task.vo.QaTaskVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
大家好,现在有个需求。用户在页面设定时间,在次日的1点执行定时任务。看了Quartz和TimerTask,他们是根据当期时间然后设置一定的时间间隔来定时的执行任务。而现在只想在次日1点执行任务,而且只是执行1次,请问大家有什么好的办法?
/**
* @author :zhuyeshen
* @date :Created in 2022/2/14 16:17
*/
@Component
public class QaTaskTimer implements ApplicationRunner {
private final static Logger logger = LoggerFactory.getLogger(QaTaskTimer.class);
// 规定的每天时间15:33:30运行
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Autowired
private MaTaskDao dao;
@Autowired
private MaTaskService maTaskService;
@Autowired
private RedisCache redisCache;
@Override
public void run(ApplicationArguments args) throws Exception {
//初始化方法
QaTaskEntity qaTaskEntity = null;
startUpdate(qaTaskEntity);
}
public void startUpdate(QaTaskEntity qaTaskEntity) {
//当qaTaskEntity为null时候是代表初始化加载定时任务
if (qaTaskEntity == null) {
QaTaskQueryParam qaTaskQueryParam = new QaTaskQueryParam();
qaTaskQueryParam.setType("2");
qaTaskQueryParam.setExecStatus("1");
List<QaTaskVo> list = dao.qaTaskList(qaTaskQueryParam);
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
QaTaskEntity taskEntity = new QaTaskEntity();
QaTaskVo qaTaskVo = list.get(i);
if (qaTaskVo == null) {
break;
}
BeanUtils.copyProperties(qaTaskVo, taskEntity);
// 首次运行时间
Date startTime = taskEntity.getExecTime();
if (!isPastDate(startTime)) {
//设置计时间隔
Timer timer = new Timer(true);
timer.schedule(new TimerTask() {
@Override
public void run() {
//需要执行的代码
if (null != redisCache.getLockService().lock("qa_task_timer", 10000, 1)) {
try {
maTaskService.execuQaTask(taskEntity);
logger.info("------定时任务执行" + JSON.toJSONString(taskEntity));
} catch (Exception e) {
logger.error("定时任务异常" + JSON.toJSONString(qaTaskEntity), e.getMessage());
}
}
}
}, startTime);
}
}
}
} else {
// 首次运行时间
Date startTime = qaTaskEntity.getExecTime();
if (!isPastDate(startTime)) {
//设置计时间隔
Timer timer = new Timer(true);
timer.schedule(new TimerTask() {
@Override
public void run() {
//需要执行的代码
if (null != redisCache.getLockService().lock("qa_task_timer", 10000, 1)) {
try {
maTaskService.execuQaTask(qaTaskEntity);
logger.info("------定时任务执行" + JSON.toJSONString(qaTaskEntity));
} catch (Exception e) {
logger.error("定时任务异常" + JSON.toJSONString(qaTaskEntity), e.getMessage());
}
}
}
}, startTime);
}
}
}
public static boolean isPastDate(Date pastDat) {
boolean flag = false;
Date nowDate = new Date();
//格式化日期
//在日期字符串非空时执行
if (pastDat != null && !"".equals(pastDat)) {
//调用Date里面的before方法来做判断
flag = pastDat.before(nowDate);
if (flag) {
logger.info("该日期早于今日");
} else {
logger.info("该日期晚于今日");
}
} else {
logger.info("日期参数不可为空");
}
return flag;
}
}