数据人与超自然意识 发表于 2024-12-21 14:39:08

Spring Boot 中的 @Scheduled 定时使命以及开关控制

Scheduled注解是Spring框架(包罗Spring Boot)中用于实现定时使命的一种方式。以下是对Scheduled注解的详细解析:
一、根本概念

Scheduled注解允许开发者在Spring容器中定义定时使命。通过简单地在一个方法上添加Scheduled注解,Spring容器就会主动将这个方法配置为一个定时使命。这种方式不仅简化了定时使命的创建,还使得定时使命的管理变得更加机动和可维护。
二、使用方式

Scheduled注解支持多种配置选项,包罗执行计划、固定延迟、固定速率等。以下是一些常见的使用方式:

[*]固定速率执行:使用fixedRate属性指定使命执行的固定速率(以毫秒为单位)。例如,@Scheduled(fixedRate=5000)表示使命将每5秒执行一次。
[*]固定延迟执行:使用fixedDelay属性指定使命在上一次执行完成后等待的固定延迟时间(以毫秒为单位)。例如,@Scheduled(fixedDelay=5000)表示使命将在上一次执行完成后5秒再次执行。
[*]Cron表达式:使用cron属性指定一个cron表达式来定义使命的执行计划。Cron表达式是一个字符串,由6或7个空格隔开的域构成,每个域代表一个时间单位(秒、分、时、日、月、周、年,此中年可选)。例如,@Scheduled(cron="0 0 12 * * ?")表示使命将在天天的中午12点执行。
三、注意事项


[*]@EnableScheduling注解:要使Scheduled注解见效,需要在配置类上添加@EnableScheduling注解。这个注解会开启Spring的定时使命支持,并注册一个ScheduledAnnotationBeanPostProcessor实例来解析和处置惩罚带有Scheduled注解的方法。
[*]线程池:在Spring Boot中,所有通过Scheduled注解定义的定时使命都会被放入一个公用的线程池中执行。默认环境下,该线程池的并发线程数为1,即所有的使命会使用同一个线程被依次执行。如果需要并行执行多个使命,可以通过配置spring.task.scheduling.pool.size属性来增长线程池的大小。
[*]使命执行时间:如果使命执行时间凌驾间隔时间(对于fixedRate)或延迟时间(对于fixedDelay),Spring将尽可能地安排下一次执行。但是,这可能会导致使命的实际执行时间与预期有所偏差。因此,发起尽量保证使命可以或许在较短的时间内执行完毕。
[*]异常处置惩罚:在实际部署时,需要思量使命执行时的异常处置惩罚和日志记录。如果使命在执行过程中抛出异常,可能会影响后续使命的执行。因此,发起添加适当的异常处置惩罚逻辑来捕获和处置惩罚可能出现的异常。
四、示例代码

以下是一个使用Scheduled注解创建定时使命的示例代码:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
      System.out.println("The current time is: " + new java.util.Date());
    }
}

// 配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
      ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
      taskScheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 2 + 10);
      taskScheduler.initialize();
      taskRegistrar.setTaskScheduler(taskScheduler);
    }
}
在这个示例中,ScheduledTasks类中的reportCurrentTime方法被标志为一个定时使命,每5秒执行一次并打印当前时间。同时,在配置类SchedulingConfig上添加了@EnableScheduling注解来开启定时使命支持。
综上所述,Scheduled注解是Spring框架中用于实现定时使命的一种方便且强盛的方式。通过公道配置和使用Scheduled注解,可以轻松地创建和管理各种定时使命以满足差异的业务需求。
五、开关控订定时使命

配置
jobs:
corn:
    enable: true
    testTask: "0 0/5 * * * ?"
定时使命
@ConditionalOnProperty(prefix = "jobs.corn", name = "enable", havingValue = "true")
@Component
@Slf4j
public class TestTask {

    @Autowired
    TrainingJobService trainingJobService;

    @Scheduled(cron = "${jobs.corn.testTask:0/15 * * * * ?}")
    public void test() {
      log.info("TestTask test start");
      
    }


}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Spring Boot 中的 @Scheduled 定时使命以及开关控制