在SpringBoot中使用定时任务注解实现简单的定时任务

定时任务,其实在我们开发过程中经常会碰到的一个场景,比如,我现在想要给某些用户定时的发送一些短信呀,邮件呀什么的,也可以用来定时的检查或者监测我们对一些参数的处理。玩的花的可以用来帮我我们进行网页签到,甚至隔一段时间爬取网页的某些数据,具体还得看你怎么用,这里只提供一个定时任务案例,具体实施,得看你想怎么用了。

使用@Scheduled创建一个定时任务

在Spirng Boot中创建一个定时任务,我们可以通过Spring Boot的自带的注解来创建一个简单的定时任务,实现每隔一段时间输出当前的时间。

引入相关依赖:

		 <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <scope>providedscope>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>

在我们的Spring Boot中的主类加入@EnableScheduing注解,启动定时任务配置:

@EnableScheduling
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
       SpringApplication.run(Application.class, args);
    }
}

接下来,我们可创建一个简单的定时任务。

@Slf4j
@Component
@AllArgsConstructor
public class ScheduledTasks {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

//创建一个定时任务执行时间,单位毫秒
    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        log.info("现在时间:" + dateFormat.format(new Date()));
    }

    @Scheduled(cron = "0 0 12 * * ?")
    public void reportScheduled(){
        log.info("每天中午12点执行");
    }

    @Scheduled(fixedDelay = 5000) // 任务执行完毕后,延迟5秒再执行下一次
    public void reportTest(){
        log.info("任务执行完毕后,延迟5秒后再执行下一次");
    }

}

在这里插入图片描述

接下来,我们可以看看@Scheduled的参数

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String CRON_DISABLED = "-";
    
    String cron() default "";
    
    String zone() default "";
    
    long fixedDelay() default -1L;
    
    String fixedDelayString() default "";
    
    long fixedRate() default -1L;
    
    String fixedRateString() default "";

    long initialDelay() default -1L;
    
    String initialDelayString() default "";
}

String cron() default ""; 用于指定任务的执行时区。它是一个字符串,表示任务应该在哪个时区执行。例如,@Scheduled(cron = "0 0 12 * * ?", zone = "America/New_York")表示任务在美国纽约时区的中午12点执行。

String zone() default "";用于指定任务的执行时间表达式。它是一个字符串,遵循Cron表达式的语法规则。Cron表达式由6个或7个字段组成,分别表示秒、分钟、小时、日期、月份、星期和年份(可选)。例如,0 0 12 * * ?表示每天中午12点执行任务。

long fixedDelay() default -1L;上一次执行结束到下一次执行开始的间隔时间,单位毫秒 ms

String fixedDelayString() default ""; 与fixedDelay类似,用于指定任务的执行间隔时间。同样,fixedDelayString接受一个字符串参数,可以使用更友好的时间表达方式。

long fixedRate() default -1L; 用于指定任务的执行间隔时间(毫秒)。它表示每隔指定的时间执行一次任务,不考虑任务的执行时间。例如,@Scheduled(fixedRate = 5000)表示每隔5秒执行一次任务。

String fixedRateString() default ""; 与fixedRate类似,用于指定任务的执行间隔时间。同样,fixedRateString接受一个字符串参数,可以使用更友好的时间表达方式。

long initialDelay() default -1L; 用于指定任务的初始延迟时间(毫秒)。它表示在应用启动后,延迟指定的时间后开始执行第一次任务。例如,@Scheduled(initialDelay = 10000, fixedRate = 5000)表示在应用启动后延迟10秒开始执行第一次任务,然后每隔5秒执行一次任务。

String initialDelayString() default ""; 与initialDelay类似,用于指定任务的初始延迟时间。不同之处在于,initialDelayString接受一个字符串参数,可以使用更友好的时间表达方式,如"10s"表示10秒,"5m"表示5分钟,"1h"表示1小时,等等。

注意@Scheduled使用过多也是会存在问题的,具体有以下问题:

  • 依赖于应用程序的生命周期:@Scheduled注解是基于应用程序的生命周期来触发任务执行的。这意味着如果应用程序停止或重启,所有的定时任务也会被中断。因此,如果你的应用程序需要保证任务的连续执行,可能需要考虑其他的解决方案。

  • 单线程执行:默认情况下,@Scheduled注解使用单线程执行定时任务。这意味着如果一个任务的执行时间较长,会影响其他任务的执行。如果你的应用程序需要同时执行多个耗时任务,可能需要考虑使用线程池或其他并发机制来提高任务的执行效率。

  • 无法动态修改任务配置:一旦使用@Scheduled注解配置了定时任务,任务的执行时间和规则就固定了,无法在运行时动态修改。如果你的应用程序需要根据外部条件或配置来调整任务的执行时间,可能需要考虑其他的解决方案。

  • 缺乏集中管理:当应用程序中存在多个定时任务时,使用@Scheduled注解会导致任务的配置分散在不同的方法或类中,不便于集中管理和监控。如果你需要对定时任务进行集中管理和监控,可能需要考虑使用专门的定时任务框架或工具。

你可能感兴趣的:(#,Spring,spring,boot,java,后端)