SpringBoot 定时任务@Scheduled及SchedulingConfigurer

时间:2022-03-01 07:48:31

SpringBoot 定时任务@Scheduled及SchedulingConfigurerSpringBoot 定时任务@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装配依赖对象,重新赋值即可