SpringBoot 定时任务@Scheduled及SchedulingConfigurer
版权声明:本文为博主原创文章,转载请附名地址https://www.cnblogs.com/slei212/p/10732260.html
注:Spring 中,创建定时任务除了使用@Scheduled 注解外,还可以使用 SchedulingConfigurer。
@Schedule 注解有一个缺点,其定时的时间不能动态的改变,而基于 SchedulingConfigurer 接口的方式可以做到。SchedulingConfigurer 接口可以实现在@Configuration 类上,同时不要忘了,还需要@EnableScheduling 注解的支持。
1.基于注解实现方式
@Component @EnableScheduling //开启定时任务 @EnableAsync //开启多线程 public class TimerJob { private Logger log = Logger.getLogger(TimerJob.class); @Async //异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用 者无需等待它的完成,即可继续其他的操作。 @Scheduled(cron = "* 0/30 * * * ?") //时间规则 public void matterTasks() { //业务逻辑 } }
2.SchedulingConfigurer实现方式
2.1、在启动类必须加上@EnableScheduling //开启定时任务
2.2、实现SchedulingConfigurer并重写configureTasks方法
@Component //实现SchedulingConfigurer并重写configureTasks方法 public class OrderJobThread implements SchedulingConfigurer { private Logger log = LoggerFactory.getLogger(OrderJobThread.class); private String cron = "* 0/1 * * * ?"; //调用set方法可动态设置时间规则 public String getCron() { return cron; } public void setCron(String cron) { this.cron = cron; } private String name = "测试"; //调用set方法可以动态设置日志名 public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addCronTask(new Runnable() { @Override public void run() { log.warn(name+" --- > 开始"); //业务逻辑 log.warn(name+" --- > 结束"); } }, cron); //加入时间 } }
2.3、设置项目启动后,初始化 定时任务执行时间
有时希望项目在启动的时候加载一些系统参数或者方法,就要用到ApplicationRunner
ApplicationRunner是一个接口,我们需要实现它,并重写run()方法,当项目启动时,run()方法便会自动执行
@Component @Order(value = 1) //value值会 从小至大的执行 public class TimmerStartController implements ApplicationRunner { private static Logger logger = LoggerFactory.getLogger(TimmerStartController.class); @Autowired private OrderJobThread orderJobThread; //得到定时任务 @Override public void run(ApplicationArguments args) throws Exception { logger.info("=========== 项目启动后,初始化 定时任务执行时间 ============="); orderJobThread.setCron("* 0/5 * * * ?"); //根据需求重新赋值时间规则 orderJobThread.setName("ordersTasks"); //赋值name } }
2.4、如需获取配置文件里设置的值
2.4.1、
@Component @PropertySource("classpath:配置文件名") public class Configration { @Value("${配置文件里参数名}") private String ordersTasks; //set、get方法 }
2.4.2、使用@Autowired装配依赖对象,重新赋值即可