SpringBoot 原生 Task定时任务 & Corn表达式

使用说明

说明:Spring的原生Task定时任务 只支持6位的Corn表达式且相关方法不得有入参。所以在时间单位上不支持”年“的,仅支持:秒 分 时 日 月 周

SpringTask定时任务是默认单线程的!所以一旦有某一个定时任务阻塞,那么其他的定时任务将不会执行。我们需要配置一下原生任务的线程池,这样就不会或减少任务受到单线程的影响了。

SpringTask定时任务不适用于多集群部署,因为集群间无法共享任务,比如定时给张三背包发送1千万游戏币,10台服务,就会发送10次任务,所以使用有局限性,最好使用第三方定时任务框架如XXX-JOB等。

即便配置了多线程,SpringTask也不是完全解决了多任务的执行问题。配置任务线程池是处理任务类型时使用的。如果每分钟执行一次的任务A,单本次任务没执行完毕,下一分钟的任务A就不会执行,相当于跳过了。

如果需要指定异步线程池 请参考:https://www.zanglikun.com/8723.html 不过,使用了异步线程池的任务,也一样会发生跳任务的情况发生,而且指定的异步任务,也会发生指定的线程池的线程抢不过默认的Task线程池的情况的!不过只要有线程干活,其他也就无所谓了。下文代码可参考:

// 请自己配置一个线程池!指定name为asyncServiceExecutor,或参考https://www.zanglikun.com/8723.html
    @SneakyThrows
    @Async("asyncServiceExecutor")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void hell1(){
        Thread.sleep(5_000);
        System.out.println(Thread.currentThread().getName()+" A执行了 "+new DateTime().toString());
    }

    @SneakyThrows
    @Async("asyncServiceExecutor")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void hell2(){
        Thread.sleep(5_000);
        System.out.println(Thread.currentThread().getName()+" B执行了 "+new DateTime().toString());
    }

注意:Springboot 在周的表达上与常规的corn表达式不合适

建议指定周几使用:SUN, MON, TUE, WED, THU, FRI, SAT 代替数字!

如果你是周日执行,常规的Corn表达式周末是1,但是生效的是0

同时:测试的时候,需要提前修改日期。Jrebel似乎不起作用,测试请自己主动重启服务。

正文:操作步骤

1、启动类里面使用@EnableScheduling 注解开启功能,自动扫描

# 启动类上的注解@EnableScheduling

2、配置任务多线程异步

你可以在启动类上添加,也可以自己配置

// SpringTask定时器的配置
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(15);
        // 任务线程的前缀名
        taskScheduler.setThreadNamePrefix("SpringTask-");
        // 线程池关闭时等待所有任务完成
        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        taskScheduler.initialize();
        return taskScheduler;
    }

3、在要设置定时任务的方法上添加注解,并指定cron表达式即可

# 方法上的 注解
@Scheduled(cron = "0 0 0-2 * * ?")

定时任务这初级代码就完成了。

Corn表达式不会写,直接下面,鼠标点点就能生成

Corn表达式在线生成https://www.bejson.com/othertools/cron/ 如果失效了,直接百度搜索 ”corn在线生成“ 即可

Corn表达式实战

单位:秒  分  时  日  月    
序号:1   2   3   4   5   6   7


注意:
周的内容是 周日是1 周一是2 ... 周六是7

? 只能用在日和周上面 大意是:不指定的意思。因为“日”有2个属性,月的日号 与 周的周号

* 表示任意时间

- 表示区间 如果在分的单位上为 1-10 那么表示在1分、2分...10分种内都会执行

, 表示或者 如果在分的单位上为 1,10 那么表示在1分、10分钟的时候执行

空格 表示单位间隔 秒后面跟一个空格在紧跟一个分 依次类推

在线生成,可以查看下次执行时间,方便我们确定我们的准确性

完结!

特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值