使用说明

说明: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分钟的时候执行

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

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

完结!

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤