import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.List;
/**
* @author: tiger
* @date: 2021/3/30 9:46
* @description:
*/
@Configuration
@EnableScheduling
@Slf4j
public class OrderDynamicSchedule implements SchedulingConfigurer {
// TaskCronConfig 类方法taskList()创建的bean
@Autowired
List<TaskCronConfig.Task> taskList;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
taskList.forEach(task -> {
//任务执行线程
Runnable runnable = () -> {
task.getTaskService().execute();
};
//任务触发器
Trigger trigger = triggerContext -> {
log.info("定时任务列表:{}", taskList);
//获取定时触发器,这里可以每次从数据库获取最新记录,更新触发器,实现定时间隔的动态调整
CronTrigger cronTrigger = new CronTrigger(task.getCron());
return cronTrigger.nextExecutionTime(triggerContext);
};
//注册任务
scheduledTaskRegistrar.addTriggerTask(runnable, trigger);
});
}
}
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author: tiger
* @date: 2021/3/30 11:04
* @description:
*/
@Configuration
@RefreshScope
public class TaskCronConfig {
@Autowired
private YmlConfig ymlConfig;
// 注入所有TaskService实现类
@Autowired
Map<String, TaskService> taskServiceMap;
@Bean
@RefreshScope
public List<Task> taskList() {
/** tasks: '[{"cron":"0 20-30 9 * * ?","taskServiceName":"orderOverdueTaskServiceImpl"},{"cron":"0 16-20 8 * * ?","taskServiceName":"orderOverdueTaskServiceImpl"},
{"cron":"0 27 7 * * ?","taskServiceName":"orderTakeTaskServiceImpl"},
{"cron":"0 58 17 * * ?","taskServiceName":"orderPrepareTaskServiceImpl"}]'*/
JSONArray jsonArray = JSONArray.parseArray(ymlConfig.getTasks());
System.out.println(jsonArray);
List<Task> list = new ArrayList<>();
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject j = (JSONObject) jsonArray.get(i);
TaskService taskService = taskServiceMap.get((String) j.getString("taskServiceName"));
Task task = new Task(taskService, j.getString("cron"));
list.add(task);
}
return list;
}
@Data
@AllArgsConstructor
static class Task {
/**
* 任务名称
*/
private TaskService taskService;
/**
* cron表达式
*/
private String cron;
}
}
public interface TaskService {
public void execute();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author: tiger
* @date: 2021/3/30 10:01
* @description: 其他定时任务可以实现TaskService处理单独的业务;cron表达式不同可以共用相同的TaskService;
* 比如OrderOverdueTaskServiceImpl这个实现,在上午10点执行一次,下午1点执行一次
* */
@Component(OrderOverdueTaskServiceImpl.SERVICE_NAME)
@Slf4j
public class OrderOverdueTaskServiceImpl implements TaskService {
public static final String SERVICE_NAME = "orderOverdueTaskServiceImpl";
@Autowired
private CommonRedisService commonRedisService;
@Autowired
private YmlConfig ymlConfig;
@Override
public void execute() {
boolean canRun = commonRedisService.getRedisLock(COMMON_JOB_LOCK, ymlConfig.getOrderOverdueJobLockTme());
log.info("获取锁:{}执行的机器IP:{}", canRun, ServerIpUtil.getServerIp());
if (!canRun) return;
// 实际业务
if (log.isInfoEnabled()) {
log.info(" ************ 定时任务 end ************");
}
}
}