如何使用springBoot定时器

  1. 标记配置类 @Configuration

    注意:加配置类注解的情况:

    1. 非Spring Boot应用程序:如果您正在使用传统的Spring框架而不是Spring Boot框架,您需要创建一个配置类,并在该配置类上使用@EnableScheduling注解来启用定时任务。

    ​
    @Configuration
    @EnableScheduling
    public class AppConfig {
        // 配置其他Bean或自定义定时任务
    }

    2.定时任务的定制化配置:如果您需要进行更复杂的定时任务配置,例如设置任务的执行频率、固定延迟、固定速率等,您可以创建一个配置类,并在该配置类中使用@EnableScheduling注解。然后,您可以通过实现SchedulingConfigurer接口或使用@Scheduled注解的其他属性来进行更详细的配置

    @Configuration
    @EnableScheduling
    public class AppConfig implements SchedulingConfigurer {
    ​
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            // 手动配置更复杂的定时任务属性
            taskRegistrar.setScheduler(taskScheduler());
            taskRegistrar.addTriggerTask(
                    () -> {
                        // 执行定时任务逻辑
                    },
                    triggerContext -> {
                        // 定时任务触发器的配置
                        CronTrigger cronTrigger = new CronTrigger("0 * * * * ?");
                        return cronTrigger.nextExecutionTime(triggerContext);
                    }
            );
        }
    ​
        @Bean
        public Executor taskScheduler() {
            ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
            scheduler.setPoolSize(10);
            scheduler.setThreadNamePrefix("task-scheduler-");
            return scheduler;
        }
    }
    基于接口SchedulingConfigurer 和基于注解@Scheduled 的区别:

灵活性和定制化能力:使用SchedulingConfigurer接口可以提供更高级的灵活性和定制化能力。您可以手动配置定时任务的执行计划、触发器和线程池等属性,以满足更复杂的需求。您可以根据自己的业务逻辑编写逻辑来决定何时执行任务。这种方式适合于需要更多控制权的场景。

简单性和便利性:使用@Scheduled注解更加简单和便捷。您只需将注解添加到具体的定时任务方法上,并指定执行计划即可。这种方式适合于简单的定时任务需求,无需过多的配置

可维护性和可读性:使用SchedulingConfigurer接口提供了更清晰的代码结构,使得定时任务的配置和实现分离,可以更好地进行维护和管理。而使用@Scheduled注解,则将定时任务的配置和实现集中在一个类中,可能会导致代码量较大并且不易于维护。

如果您对定时任务的配置要求较高,希望有更多的灵活性和定制化能力,可以选择使用SchedulingConfigurer接口。如果您的定时任务较为简单,并且希望代码简洁、可读性高,可以选择使用@Scheduled注解

  1. 开启定时任务 @EnableScheduling

一般情况下,在 Spring Boot 应用程序中,将 @EnableScheduling 注解添加到启动类上就足够了。这样做可以确保 Spring 框架在启动时启用定时任务,并扫描项目中带有 @Scheduled 注解的方法,然后创建相应的定时任务。

总之,只要确保 @EnableScheduling 注解被添加到了 Spring Boot 应用程序的启动类上,定时任务就会被正确地启用和管理

  1. 添加@Scheduled注解

  2. fixedRate:固定频率执行任务,以毫秒为单位。例如,@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次任务。

  3. fixedDelay:固定延迟执行任务,以毫秒为单位。它表示任务执行完成后,再经过指定的延迟时间才开始下一次任务。例如,@Scheduled(fixedDelay = 5000) 表示任务执行完成后,等待 5 秒后开始下一次任务。

  4. initialDelay:初始延迟时间,以毫秒为单位。它表示第一次任务执行前的延迟时间。例如,@Scheduled(initialDelay = 2000, fixedRate = 5000) 表示首次任务执行将延迟 2 秒,然后每隔 5 秒执行一次任务。

  5. cron ()

参数问题

在 Spring 的 @Scheduled 注解中,定时任务方法是通过反射调用的。因此,当使用 @Scheduled 注解定义定时任务方法时,该方法的参数是不会被识别或传递的。

如果你需要在定时任务方法中使用参数,有几种解决方案:

  1. 使用成员变量:你可以在类中定义成员变量,在定时任务方法内部访问这些成员变量即可。这样可以保持方法的干净和简单,但需要注意线程安全问题。

  2. 使用容器管理的 Bean:如果需要在定时任务方法中使用参数,你可以将参数封装为一个 Bean,并通过 Spring 容器进行管理。然后,在定时任务方法中通过依赖注入的方式使用该 Bean。

  3. 使用 ThreadLocal:你可以使用 ThreadLocal 将参数绑定到当前线程上下文中。在定时任务方法内部通过 ThreadLocal 获取参数值

Cron 表达式的格式如下:
Copy Code秒 分 小时 日期 月份 星期 [年份]

字段的取值范围及特殊字符的含义如下:

  • 秒(0-59)

  • 分钟(0-59)

  • 小时(0-23)

  • 日期(1-31)

  • 月份(1-12 或 JAN-DEC)

  • 星期(0-7 或 SUN-SAT)其中 0 和 7 都表示周日

  • 年份(可选,留空表示任意年份)

Cron 表达式支持以下特殊字符:

  • *:表示匹配该字段的任意值。例如,* 在分钟字段表示每分钟触发。

  • ?:表示不指定具体的值。通常用于日期和星期字段,表示无关的字段。

  • -:表示范围。例如,10-15 在日期字段表示从 10 号到 15 号。

  • /:表示步长。例如,0/5 在秒字段表示每隔 5 秒触发。

  • ,:表示多个值。例如,MON,WED,FRI 在星期字段表示周一、周三和周五触发。

  • L:表示最后一个值。例如,L 在日期字段表示月份的最后一天。

  • W:表示距离指定日期最近的工作日(周一至周五)。例如,15W 在日期字段表示离 15 号最近的工作日。

  • #:表示每月第几个星期几。例如,2#1 在星期字段表示每月第一个周一。

下面是一些示例 Cron 表达式:

  • 0 0 12 * * ?:每天中午 12 点执行任务。

  • 0 0/5 * * * ?:每隔 5 分钟执行一次任务。

  • 0 0 8,12,18 * * ?:每天的早上 8 点、中午 12 点和晚上 18 点执行任务。

  • 0 0 9 L * ?:每个月最后一天上午 9 点执行任务。

  • 0 0 10 ? * MON-FRI:每个工作日上午 10 点执行任务。

你可能感兴趣的:(spring,boot,java,spring)