博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在SpringBoot中配置定时任务
阅读量:5997 次
发布时间:2019-06-20

本文共 3902 字,大约阅读时间需要 13 分钟。

前言

之前在spring中使用过定时任务,使用注解的方式配置很方便,在SpringBoot中的配置基本相同,只是原来在spring中的xml文件的一些配置需要改变,在SpringBoot中也非常简单。

已经加入我的github模版中:

 

定时任务的分类

所谓定时任务,就是在项目启动之后,定时的去执行一个任务,从而满足业务的需要。

定时任务分为下面几种,串行,并行,同步,异步

串行,并行:当配置了多个定时任务的时候,串行方式只会有一个线程去执行所有的任务,并且前一个任务执行完成,后一个任务才会开始执行;而并行是指会启动多个线程去执行所有的任务,各个任务同时进行执行

同步,异步:这是对于一个定时任务来说,同步是指,这个定时任务本身自己完成之后才能再次执行自己;异步是指任务本身即使没有完成,当定时到达的时候也会再次执行

 

举例来说(定时任务都设置为每两秒执行一次,但是执行中睡眠3秒)

[2018-02-08 09:45:14.005] [pool-1-thread-1] [INFO ] my_info - 任务1:执行

[2018-02-08 09:45:17.007] [pool-1-thread-1] [INFO ] my_info - 任务1:执行完成
[2018-02-08 09:45:17.009] [pool-1-thread-1] [INFO ] my_info - 任务2:执行
[2018-02-08 09:45:20.012] [pool-1-thread-1] [INFO ] my_info - 任务2:执行完成
[2018-02-08 09:45:20.013] [pool-1-thread-1] [INFO ] my_info - 任务3:执行
[2018-02-08 09:45:23.016] [pool-1-thread-1] [INFO ] my_info - 任务3:执行完成
[2018-02-08 09:45:23.017] [pool-1-thread-1] [INFO ] my_info - 任务4:执行
[2018-02-08 09:45:26.021] [pool-1-thread-1] [INFO ] my_info - 任务4:执行完成
[2018-02-08 09:45:26.022] [pool-1-thread-1] [INFO ] my_info - 任务1:执行
[2018-02-08 09:45:29.026] [pool-1-thread-1] [INFO ] my_info - 任务1:执行完成

可以看到这四个任务是同一个线程执行的,并且 只有当前一个任务完成的时候,下一个任务才会开始,所以当前是串行同步的

[2018-02-08 10:02:42.004] [pool-1-thread-1] [INFO ] my_info - 任务3:执行

[2018-02-08 10:02:42.004] [pool-1-thread-3] [INFO ] my_info - 任务4:执行
[2018-02-08 10:02:42.004] [pool-1-thread-4] [INFO ] my_info - 任务1:执行
[2018-02-08 10:02:42.004] [pool-1-thread-2] [INFO ] my_info - 任务2:执行
[2018-02-08 10:02:45.011] [pool-1-thread-4] [INFO ] my_info - 任务1:执行完成
[2018-02-08 10:02:45.011] [pool-1-thread-2] [INFO ] my_info - 任务2:执行完成
[2018-02-08 10:02:45.011] [pool-1-thread-3] [INFO ] my_info - 任务4:执行完成
[2018-02-08 10:02:45.011] [pool-1-thread-1] [INFO ] my_info - 任务3:执行完成
[2018-02-08 10:02:46.005] [pool-1-thread-2] [INFO ] my_info - 任务2:执行
[2018-02-08 10:02:46.005] [pool-1-thread-4] [INFO ] my_info - 任务1:执行
[2018-02-08 10:02:46.005] [pool-1-thread-5] [INFO ] my_info - 任务4:执行
[2018-02-08 10:02:46.005] [pool-1-thread-8] [INFO ] my_info - 任务3:执行
[2018-02-08 10:02:49.011] [pool-1-thread-2] [INFO ] my_info - 任务2:执行完成
[2018-02-08 10:02:49.011] [pool-1-thread-4] [INFO ] my_info - 任务1:执行完成
[2018-02-08 10:02:49.011] [pool-1-thread-8] [INFO ] my_info - 任务3:执行完成
[2018-02-08 10:02:49.011] [pool-1-thread-5] [INFO ] my_info - 任务4:执行完成

可以看到这四个任务是不同线程执行的,并且当前也是只有在前一个任务完成的情况下才会执行下一个任务,所以当前是并行同步的

我们项目中喜欢使用的是第二种方式

 

配置方式

如果使用串行方式如下

import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;/** * 定时任务配置 * @author LinkinStar */@Configuration@EnableSchedulingpublic class TimeTaskConfig {    @Scheduled(cron = "0/5 * * * * ?")    public void test1(){        System.out.println("任务1:执行");    }}

如果使用并行方式如下

import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.SchedulingConfigurer;import org.springframework.scheduling.config.ScheduledTaskRegistrar;import java.util.concurrent.Executors;/** * 定时任务配置 * @author LinkinStar */@Configuration@EnableSchedulingpublic class TimeTaskConfig implements SchedulingConfigurer {    /**     * 配置定时任务线程池大小     */    @Override    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));    }}
import com.linkinstars.springBootTemplate.util.LogUtil;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.Scheduled;/** * 定时任务配置 * @author LinkinStar */@Configurationpublic class TimeTask {    @Scheduled(cron = "0/2 * * * * ?")    public void test1(){        LogUtil.printLog("任务1:执行");        try {            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }        LogUtil.printLog("任务1:执行完成");    }}

 

参考

 

转载地址:http://juzmx.baihongyu.com/

你可能感兴趣的文章
Java8之Stream
查看>>
响应式设计工具网站mydevice.io
查看>>
编程范式(Programming Paradigm)-[ 程序员的编程世界观 ]
查看>>
根据科目计算父科目ID,并递归累计求父科目的金额
查看>>
Dispatch Groups
查看>>
使用System.getProperty方法,如何配置JVM系统属性
查看>>
C# 正则表达式大全
查看>>
Jersey 写restful接口时QueryParam ,FormParam 等的区别
查看>>
Linux下IP SAN共享存储操作记录
查看>>
C# Word转为多种格式文件(Word转XPS/SVG/EMF/EPUB/TIFF)
查看>>
sublime 学习笔记
查看>>
Java NIO FileChannel
查看>>
PyCharm 默认运行 unittest
查看>>
使用web3j工具生成java版本的智能合约
查看>>
New UWP Community Toolkit - Carousel
查看>>
每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30...
查看>>
点击按钮,进入全屏与退出全屏切换
查看>>
在mysql命令行下执行sql文件
查看>>
【win7 + win server 2008】设置定时任务,设置.bat 文件去执行php脚本 == 用来配合爬虫程序简直不要太爽...
查看>>
php资源类型变量
查看>>