springboot调度任务

本文介绍了SpringBoot中使用@Scheduled注解设置调度任务的方法,包括参数说明、cron表达式解析,通过创建ScheduledTask类和引导类进行任务配置。实验证明调度任务是单线程执行,每次间隔3秒执行一次,修改任务内容并重新启动后,依然保持单线程特性。
摘要由CSDN通过智能技术生成

注:调度任务类上有注解@Component,调度方法上带注解@Scheduled,启动引导类上有注解@EnableScheduling,调度任务是单线程执行

一、@Scheduled参数说明

@Scheduled(cron = "0/3 * * * * ?") 从0秒开始,每隔3秒执行一次
@Scheduled(initialDelay = 1000, fixedRate = 2000) 第一次延迟1秒执行,然后在上一次开始执行时间点后2秒再次执行
@Scheduled(initialDelay=1000, fixedDelay = 2000) 第一次延迟1秒执行,然后在上一次执行完毕时间点后2秒再次执行

二、cron表达式说明

### cron表达式 
* @Scheduled(cron = "* * * * * *")
    * 顺序:{秒数} {分钟}  {小时}  {日期}  {月份} {星期} 
    * 范围:{0~59} {0~59} {0~23} {1~31} {1~12} {1~7}
    * 日期(1~7)字符串表示:SUN, MON, TUE, WED, THU, FRI, SAT
### cron表达式各占位符说明:
* “*” 代表每个单位时刻触发;
* “,” 代表在指定的秒数触发,比如”0,15,35”代表0秒、15秒和35秒时触发1次
* “-“ 代表在指定的范围内触发,比如”10-40”代表从10秒开始触发到40秒结束触发,每隔1秒触发1次
*  “/” 代表触发步进(step),”/”前面的值代表初始值(““等同”0”),后面的值代表偏移量
    * 例1:”0/10”或者”/10”代表从0秒钟开始,每隔10秒钟触发1次
        * 即0秒触发1次,10秒、20秒、30秒、40秒、50秒各触发1次;
    * 例2:”5/10”代表5秒触发1次,15秒、25秒、35秒、45秒、55秒各触发1次;
    * 例3:”10-40/20”代表在[10,40]内,每步进20秒触发,即10秒触发1次,30秒触发1次
* “?” 只在日期中和星期中使用,用来表示任意值,表示每月的某一天,或周的某一天
* ”W” 只在日期中出现,用于指定最接近给定日期的工作日(星期一至星期五)
    * 例1:“15W”含义是:“离月15日最近的工作日”。
        * 如果15号是星期六,那么触发器将在14号星期五触发。
        * 如果15日是星期日,则触发器将在16日星期一触发。
        * 如果15号是星期二,那么它将在15号星期二触发。
* “#” 只在星期中出现
    * 例1:“6#3”代表“每月的第三个星期五”
* ”L” 只在日期中和星期中出现,表示月或周的最后时间
    * 例1:“L”用在星期中,表示‘7’或者‘SAT’
    * 例2:带数字用在星期中,“6L”表示一个月的最后一个星期五
### 案例:
* “20 * * * * ?” 每分钟的20秒触发1次
* “20 10 * * * ?” 每小时的10分20秒触发1次
* “20 10 17 * * ?” 每天17点10分20秒触发1次
* “20 10 17 20 * ?” 每月20号17点10分20秒触发1次
* “20 10 17 20 10 ? *” 每年10月20号17点10分20秒触发1次
* “20 10 17 22 04 ? 2020” 2020年04月22号17点10分20秒触发1次
* “20 10 17 ? 04 * 2020” 2020年04月每天17点10分20秒触发1次
* “20 10 17 ? 10 SUN 2020” 2020年10月每周日17点10分20秒触发1次
* “15,30,45 * * * * ?” 每个15秒、30秒、45秒时各触发1次
* “15-45 * * * * ?” 15到45秒内,每秒都触发1次
* “15/5 * * * * ?” 每分钟的每15秒开始触发,每隔5秒触发一次
* “15-30/5 * * * * ?” 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
* “0 0/3 * * * ?” 每小时的第0分0秒开始,每三分钟触发一次
* “0 15 17 ? * MON-SAT” 星期一到星期六的17点15分0秒触发1次
* “0 15 17 L * ?” 每个月最后一天的17点15分0秒触发1次
* “0 15 17 LW * ?” 每个月最后一个工作日的17点15分0秒触发1次
* “0 15 17 ? * 5L” 每个月最后一个星期四的17点15分0秒触发1次
* “0 15 17 ? * 5#3” 每个月第三周的星期四的17点15分0秒触发1次
* ”0 0/5 13,18 * * ?” 每天从13点开始到13:55结束,然后从18点开始到18:55结束,每5分钟触发一次
* ”0 0 12 * * ? 2020” 2020年中每天的12:00触发一次
* “0 0-5 13 * * ?” 每天从13点开始到13:05结束的每分钟触发一次
* “0 15,45 13 ? 6 Tue” 6月的每个星期二的13:15和13:45触发一次
* “0 30 9 ? * MON-FRI” 每个星期一到星期五的9:30触发一次
* “0 30 9 15 * ?” 每月15日9:30触发一次
* “0 0 18 L * ?” 每个月的最后一天18点触发一次
* “0 0 18 L-3 * ?” 每个月的第三天至最后一天18点触发一次
* “0 30 10 ? * 5L” 每个月的最后一个星期四10:30触发一次
* ”0 0 18 ? * 6L 2018-2020“ 2018-2020每个月的最后一个星期五18点触发一次
* “0 0 10 ? * 2#3” 每个月的第三个星期一的10点触发一次
* “0 0 0 10/5 * ?” 从该月的第10天开始,每天从0点开始,为期5天各触发一次

三、demo详解 

1. 创建调度任务类ScheduledTask

package com.zsx.action;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
@Slf4j
public class ScheduledTask {


    /**
     * {秒数:0~59} {分钟:0~59} {小时:0~23}
     * {日期:1~31} {月份:1~12} {星期:1~7}
     */
    @Scheduled(cron = "0/3 * * * * ?")
    public void runA() throws InterruptedException {
        log.info(Thread.currentThread().getName() + "AAA Start");
    }


}

2. 创建引导类并启动

package com.zsx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class MyTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyTestApplication.class, args);
    }

}

3. 查看控制台输出结果

E:\jdk\jdk-13.0.1\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:E:\JetBrains\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=59731:E:\JetBrains\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath D:\MyIdeaProjects\my-test\target\classes;E:\maven\repository\org\springframework\boot\spring-boot-starter-web\2.2.0.RELEASE\spring-boot-starter-web-2.2.0.RELEASE.jar;E:\maven\repository\org
SpringBoot整合Quartz任务定时调度可以使用Quartz框架来实现。Quartz是一个由Java编写的开源任务调度框架,可以通过设置触发器来定义作业的运行规则和运行时间。在SpringBoot中,我们可以通过配置依赖和编写相应的代码来实现定时任务调度。 具体的步骤如下: 1. 引入Quartz的相关依赖。可以参考中的博客链接,其中有详细的依赖配置和示例代码。 2. 创建一个JobDetail对象,用于描述要执行任务的核心逻辑。可以使用Quartz提供的Job接口来实现自己的任务逻辑。 3. 创建一个Trigger对象,用于设置触发任务执行的规则。可以设置任务的触发时间、周期等。 4. 创建一个Scheduler对象,用于管理任务调度。可以注册多个JobDetail和Trigger到Scheduler中。 5. 启动Scheduler,开始执行任务。 在SpringBoot中,可以通过使用@Configuration和@EnableScheduling注解来开启定时任务的自动配置。然后可以使用@Scheduled注解来标记定时执行的方法。 例如: ``` @Configuration @EnableScheduling public class SchedulerConfig { @Bean public SchedulerFactoryBean schedulerFactoryBean() { return new SchedulerFactoryBean(); } @Bean public JobDetail jobDetail() { return JobBuilder.newJob(MyJob.class).withIdentity("myJob").storeDurably().build(); } @Bean public Trigger trigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger().forJob(jobDetail()) .withIdentity("myTrigger") .withSchedule(scheduleBuilder) .build(); } } ``` ``` @Component public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 任务执行的逻辑 } @Scheduled(cron = "0 0 12 * * ?") // 每天中午12点执行一次 public void scheduledMethod() { // 定时任务的逻辑 } } ``` 以上是一种在SpringBoot中使用Quartz实现定时任务的方式,你可以根据自己的需求来选择合适的方式来实现定时任务调度。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值