springboot中实现定时任务

两种方式:Quartz和Task

Quartz

使用步骤:

1、导入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、写任务,要求必须继承QuartzJobBean,重写的方法executeInternal()中就是你要定时执行的逻辑
public class DemoTask extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("这是一个定时任务");
    }
}
3、添加配置类,这里也是告诉springboot这是一个定时任务,同时还要把执行规则定义好
@Configuration
public class QuartzConfig {
    //这里其实就是把任务包装一下
    @Bean
    public JobDetail jobDetail(){
        return JobBuilder.newJob(DemoTask.class).storeDurably().build();
    }

    //这里要定义个调度器,也就是执行这个任务的时间规则,这个表达式是按具体的要求写的
    //然后返回的这个是触发器,把上面的任务和下面的调度器组合到一起,这样springboot就知道要在什么时候执行什么任务了
    @Bean
    public Trigger trigger(){
        ScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
        return TriggerBuilder.newTrigger().forJob(jobDetail()).withSchedule(scheduleBuilder).build();
    }
}
4、启动测试:

自己试吧

Task

这是spring自己开发的执行定时任务的功能,简单到你不会认为这是一个技术

1、在启动类上开启定时任务功能,加注解@EnableScheduling
@SpringBootApplication
@EnableScheduling
public class Springboot11TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot11TaskApplication.class, args);
    }
}
2、写任务,随便在一个bean里面写,只要在方法前加个注解@Scheduled(),括号里告诉他执行规则。只是要注意一下一定是要在bean里面写任务方法。
@Component
public class DemoTask {

    @Scheduled(cron = "0/3 * * * * ?")
    public void print(){
        System.out.println("this is  a  task 。。。。。");
    }

}
cron表达式规则:

其实定时任务这块的写法没什么问题,麻烦一点的是这个执行规则的cron表达式,这个是字符串,容易写错,需要特别注意一下。

随便拿来一个表达式:“0/3 * * * * ?”

总共是7部分,最后一个年可空,分别是:
”秒 分 时 日 月 周 年“

除了年,其他都不能为空

每一部分都有范围,比如分秒只能0-59,日只能1-31,周只能1-7,这个好理解

每一部分除了数字,还能写符号: * , - / ?

” * “ 表示每

在秒的位置,就是每秒,在日的位置就是每日,所以这个 * 不能出现在周的位置,你不能每周对吧,如果要指定周,一定要明确是每周几。

“,”表示和的意思

比如秒的位置 1,10,20 ,意思就是第1秒和第10秒和第20秒各触发一次,如果在月的位置上:2,3,6,就表示2月、3月、6月触发

“-”表示区间

2-5就表示从2到5,那么放在哪个单位上,就对应哪个单位的这段时间,比如日:3-8,那就是从3日到8日,也就是3、4、5、6、7、8这几天触发

“/"表示间隔

“/”前后各一个数字,表示从前一个数字开始,间隔后一个数字的时间触发,比如在秒的位置上,25/10,意思就是从第25秒开始,每10秒触发一次,也就是第25秒、第35秒、第45秒、第55秒各触发一次,等这一分钟完了,下一分钟再从第25秒开始。

“?”这个比较特殊,表示不设置的意思,

这个只能出现在周和日的位置上,因为这两个不能同时设置,否则就对不上就麻烦了。周的位置如果是?,表示不用考虑周,如果是数字,那就是每周几,同时如果周这个位置上写了数字,那么日那个位置上就要写?了,因为这两个不能同时指定

前面 ,-,/ 这几个也可以组合使用,但是估计一般很少有那种变态需求,碰到了就自己写一个试吧,平时不用记住了也会忘

举几个例子解释一下:

“0 0 13 * * ?” 每天13:00:00执行

“20 15 10 * * ?” 每天10:15:20执行

“0 35 13 * * ? 2022” 2022年每天13:35:00执行

“0 * 13 * * ?” 每天13点到14点每分钟0秒执行一次

“0 0/5 13 * * ?” 每天13点到14点每隔5分钟执行一次

“0 0/5 10,18 * * ?” 每天10点到11点,18点到19点,这两个时段内每隔5分钟执行一次

“0 0-5 14 * * ?” 每天14:00:00到14:05:00每分钟执行执行一次

更详细的规则可以参考:https://www.jianshu.com/p/e9ce1a7e1ed1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值