定时任务执行时间动态配置,并且略微错开

这是一个较为复杂的定时任务需求,仅用简单的schedule注解无法满足需求

package com.wisedu.minos.deploy.school.api;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wisedu.minos.deploy.school.api.service.ApiService;
import com.wisedu.minos.deploy.school.dao.entity.UploadSettingsEntity;
import com.wisedu.minos.deploy.school.dao.mapper.UploadSettingsMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;
import java.util.Random;

@Component
public class Scheduling implements SchedulingConfigurer {
protected final static Logger logger = LoggerFactory.getLogger(Scheduling.class);

public static String cron;

@Autowired
private UploadSettingsMapper uploadSettingsMapper;

@Autowired
private ApiService apiService;

public Scheduling() {
cron = "0 0 2 * * *";
}

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Runnable task = new Runnable() {
@Override
public void run() {
try {
                //错开
Thread.sleep((int)(Math.random()*60+1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
            //执行业务逻辑
apiService.uploadInfo();
}
};
Trigger trigger = new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
LambdaQueryWrapper<UploadSettingsEntity> eq = new LambdaQueryWrapper<UploadSettingsEntity>()
.eq(UploadSettingsEntity::getIsDeleted, 0);
List<UploadSettingsEntity> uploadSettingsEntities = uploadSettingsMapper.selectList(eq);
if(!CollectionUtils.isEmpty(uploadSettingsEntities)&&(uploadSettingsEntities.get(0).getTime()>=0&&uploadSettingsEntities.get(0).getTime()<24)){
//拼装cron表达式
            cron = "0 0 "+uploadSettingsEntities.get(0).getTime()+" * * *";

}
CronTrigger trigger = new CronTrigger(cron);
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
};
taskRegistrar.addTriggerTask(task, trigger);
}
}
posted @ 2021-08-04 22:09  红嘴鲤鱼  阅读(369)  评论(0编辑  收藏  举报