@Schedule注解的一个缺点就是其定时时间不能动态更改,它适用于具有固定任务周期的任务,若要修改任务执行周期,只能走“停服务→修改任务执行周期→重启服务”这条路。
而基于 SchedulingConfigurer 接口方式可以做。
SchedulingConfigurer 接口可以实现在@Configuration 类上,同时不要忘了,还需要@EnableScheduling 注解的支持。
使用方法
1、创建数据库
1 2 3 4 5 6 7 8 9 10
| CREATE TABLE `trip_job_lock` ( `job_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '定时任务名称', `is_lock` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否开启任务 1-开启,0-关闭', `job_cron` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '定时任务执行时间间隔', `job_desc` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '定时任务中午描述', PRIMARY KEY (`job_name`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '定时任务配置表' ROW_FORMAT = Dynamic;
INSERT INTO `trip_job_lock` VALUES ('1', NULL, '0/5 * * * * ?', NULL);
|
2、后端实现方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
public interface JobMapper {
@Select("<script>SELECT is_lock FROM trip_job_lock WHERE job_name = #{jobName}</script>") public String getIsLock(String jobName);
@Select("<script>SELECT job_cron FROM trip_job_lock WHERE job_name = #{jobName}</script>") public String getCron(String jobName); }
@Component @SuppressWarnings("all") @Slf4j @EnableScheduling @Configuration public class AirTicketSettlementScheduler implements SchedulingConfigurer {
@Resource private AirTicketSettlementTaskService airTicketSettlementTaskService; @Resource CtripUtil ctripUtil;
@Autowired SnowFlake snowFlake;
@Autowired ScheduledByRedisIP scheduledByRedisIP;
@Autowired LogRecordService logRecordService;
@Value("${FlightSettlementURL}") private String FlightSettlementURL;
@Resource JobMapper jobMapper; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( () -> isScheduler(), triggerContext -> { String cron = jobMapper.getCron("AirTicketSettlementScheduler"); if (StringUtils.isEmpty(cron)) { }
return new CronTrigger(cron).nextExecutionTime(triggerContext); } ); }
public void isScheduler(){ String isLock = jobMapper.getIsLock("AirTicketSettlementScheduler"); if("1".equals(isLock)) { updateAirSettlementTask(); }else{ log.info("机票结算数据入库定时任务已关闭!"); } }
private void updateAirSettlementTask() { } }
|