当前位置 : 首页 » 文章分类 :  开发  »  SpringBoot-@Scheduled定时任务

SpringBoot-@Scheduled定时任务

Spring @Scheduled 定时任务笔记

Spring提供了两种任务调度方法:
1、同步任务,@Scheduled,通过 @EnableScheduling 启用
2、异步任务,@Async,通过 @EnableAsync 启用


@Scheduled源码

package org.springframework.scheduling.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    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 "";
}

@EnableScheduling启用定时任务

在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置

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

定时方法上添加@Scheduled

@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
@Scheduled(cron=”/5 “) :通过cron表达式定义规则

@Component
public class ScheduledTasks {
    public final static long ONE_DAY = 24 * 60 * 60 * 1000;
    public final static long ONE_HOUR =  60 * 60 * 1000;

    @Scheduled(fixedRate = ONE_DAY)
    public void scheduledTask() {
       System.out.println(" 我是一个每隔一天就会执行一次的调度任务");
    }

    @Scheduled(fixedDelay = ONE_HOURS)
    public void scheduleTask2() {
       System.out.println(" 我是一个执行完后,隔一小时就会执行的任务");
    }

    @Scheduled(initialDelay=1000, fixedRate=5000)
    public void doSomething() {
       System.out.println("我是一个第一次延迟1秒执行,之后每5秒执行一次的任务");
    }

    @Scheduled(cron = "0 0/1 * * * ? ")
    public void ScheduledTask3() {
       System.out.println(" 我是一个每隔一分钟就就会执行的任务");
    }
}

Spring Boot中使用@Scheduled创建定时任务
http://blog.didispace.com/springbootscheduled/


读取配置文件中的cron时间配置

第二种在你的类前面添加
@PropertySource(“classpath:root/test.props”)
@Scheduled(cron=”${jobs.schedule}”)
最后test.props 添加 jobs.schedule = 0/5 * * * * ?

Spring使用@Scheduled进行定时任务,定的时间可否变?
https://www.oschina.net/question/578674_84037


避免集群环境下任务重复调度

当 @Scheduled 定时任务部署在集群环境下时,会出现任务多次被调度执行的情况,因为 @Scheduled 只是个轻量级的本地定时任务,本身不提供集群调度功能。
为了避免集群环境下任务重复调度,可以采用如下方法;
1、调度方法加redis分布式锁,防止同一个任务被多次调度。
2、改用Quartz定时任务框架,Quartz提供基于数据库持久化的集群调度功能。

如何用Spring实现集群环境下的定时任务
https://blog.csdn.net/caomiao2006/article/details/52750569


上一篇 SpringBoot-@Async异步调用

下一篇 SpringBoot整合MyBatis

阅读
647
阅读预计3分钟
创建日期 2018-06-28
修改日期 2018-07-02
类别
百度推荐