SpringBoot中使用@Scheduled实现定时任务通过读取配置文件动态开关

发布时间 2023-05-25 16:23:02作者: 霸道流氓

场景

SpringBoot中定时任务与异步定时任务的实现:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/117083609

上面讲的通过@Scheduled注解实现简单定时任务的方式。

如果定时任务有多个,不同业务场景下需要动态配置某个定时任务的开关。

可以通过@ConditionalOnProperty注解来实现。

@ConditionalOnProperty

@ConditionalOnProperty注解来控制@Configuration是否生效。

把每个定时定位抽离出到单独一个Task类中,将Task类原来的@Component注解改为

@Configuration注解。然后在配置文件中配置对应的定时任务是否执行的表达式,在注解

@ConditionalOnProperty配置对应的配置文件的表达式。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、配置文件application.yml中添加配置项

task:
  getPositionData: "50000"
  getPositionDataEnable: true
  getSignalData: "50000"
  getSignalDataEnable: false

2、修改Task类

package com.badao.demo.task;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;


@Configuration
@EnableScheduling
@ConditionalOnProperty(name="task.getPositionDataEnable")
public class GetPositionDataTask {

    @Scheduled(fixedRateString = "${task.getPositionData}")
    public void  getPositionData(){
       
    }
   
}

这里task.getPositionDataEnable为true则配置生效,定时任务执行;为false则配置不生效,定时任务不执行。

这里为true,则此定时任务执行。

同理另一个定时任务类也做同样修改

package com.badao.demo.task;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;


@Configuration
@EnableScheduling
@ConditionalOnProperty(name="task.getSignalDataEnable")
public class GetSignalDataTask {

    @Scheduled(fixedRateString = "${task.getSignalData}")
    public void  getSignalData(){
      
    }
}

则该定时任务不执行。