定时任务类实现SchedulingConfigurer,直接上代码
package com.sanxin.cloud.app.api.task;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sanxin.cloud.common.StaticUtils;
import com.sanxin.cloud.entity.GrabSinglePond;
import com.sanxin.cloud.service.GrabSinglePondService;
import com.sanxin.cloud.service.InfoParamService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.FixedRateTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
/**
* @author zero
* @version 1.0
* @date 2020-12-31
*/
@Lazy(value = false)
@Component
public class OrderTask implements SchedulingConfigurer {
@Autowired
private GrabSinglePondService grabSinglePondService;
@Autowired
private InfoParamService infoParamService;
private Logger logger = LoggerFactory.getLogger(OrderTask.class);
/**
* 定时发送取消弹窗
*/
// @Scheduled(fixedRate = 3000)
public void sendTimeCancelOrder() {
List<GrabSinglePond> singlePonds = grabSinglePondService.list(new QueryWrapper<GrabSinglePond>()
.eq("status", StaticUtils.STATUS_YES));
System.out.println(singlePonds);
configureTasks(new ScheduledTaskRegistrar());
logger.info("定时器重置");//每次执行实现的方法重置
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
logger.info("定时任务启动");
//通过校验的数据执行定时任务
try {
scheduledTaskRegistrar.addTriggerTask(getRunnable(), getTrigger());
} catch (Exception e) {
logger.error("定时任务启动错误");
}
logger.info("定时任务启动完成");
}
private Trigger getTrigger() {
return new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//将Cron 0/1 * * * * ? 输入取得下一次执行的时间
String orderCancelWindow = infoParamService.getValueByCode("order_cancel_window");//数据库配置的定时策略
CronTrigger trigger = new CronTrigger(orderCancelWindow);
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
};
}
private Runnable getRunnable() {
return new Runnable() {
@Override
public void run() {
try {
Method method = OrderTask.class.getMethod("sendTimeCancelOrder", null);//如果是当前类直接执行方法,其他类的方法可以通过class或者getBean实现
method.invoke(OrderTask.this);
} catch (InvocationTargetException e) {
logger.error("定时任务启动错误,反射异常:");
} catch (Exception e) {
logger.error(e.getMessage());
}
}
};
}
}