Java spring定时任务详解


Posted in Java/Android onOctober 05, 2021

一、定时任务

1、cron表达式

语法:秒 分 时 日 月 周 年

(其中“年”Spring不支持,也就是说在spring定时任务中只能设置:秒 分 时 日 月 周)

Java spring定时任务详解

Java spring定时任务详解

2、cron示例

Java spring定时任务详解

Java spring定时任务详解

3、SpringBoot整合

@EnableScheduling

@Scheduled

实例:

package com.xunqi.gulimall.seckill.scheduled;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
 * @Description:
 * @Created: with IntelliJ IDEA.
 * @author: 夏沫止水
 * @createTime: 2020-07-09 18:49
 **/
/**
 * 定时任务
 *      1、@EnableScheduling 开启定时任务
 *      2、@Scheduled开启一个定时任务
 *
 * 异步任务
 *      1、@EnableAsync:开启异步任务
 *      2、@Async:给希望异步执行的方法标注
 */
@Slf4j
@Component
@EnableScheduling
public class HelloScheduled {
    /**
     * 1、在Spring中表达式是6位组成,不允许第七位的年份
     * 2、在周几的的位置,1-7代表周一到周日
     * 3、定时任务不该阻塞。默认是阻塞的
     *      1)、可以让业务以异步的方式,自己提交到线程池
     *              CompletableFuture.runAsync(() -> {
     *         },execute);
     *
     *      2)、支持定时任务线程池;设置 TaskSchedulingProperties
     *        spring.task.scheduling.pool.size: 5
     *
     *      3)、让定时任务异步执行
     *          异步任务
     *
     *      解决:使用异步任务 + 定时任务来完成定时任务不阻塞的功能
     *
     */
     @Scheduled(cron = "*/1 * * * * ?")
     public void hello() {
         log.info("hello...");
         try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
     }
}

定时任务默认是阻塞的线程,也就是说即使你设置成每一秒执行一次,但是方法内部的业务时间需要5秒才能执行完,也会造成定时任务每6秒才能执行一次。

当然我们可以开启异步线程:

@EnableAsync

@Async

实例:

package com.xunqi.gulimall.seckill.scheduled;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
 * @Description:
 * @Created: with IntelliJ IDEA.
 * @author: 夏沫止水
 * @createTime: 2020-07-09 18:49
 **/
/**
 * 定时任务
 *      1、@EnableScheduling 开启定时任务
 *      2、@Scheduled开启一个定时任务
 *
 * 异步任务
 *      1、@EnableAsync:开启异步任务
 *      2、@Async:给希望异步执行的方法标注
 */
@Slf4j
@Component
@EnableAsync
@EnableScheduling
public class HelloScheduled {
    /**
     * 1、在Spring中表达式是6位组成,不允许第七位的年份
     * 2、在周几的的位置,1-7代表周一到周日
     * 3、定时任务不该阻塞。默认是阻塞的
     *      1)、可以让业务以异步的方式,自己提交到线程池
     *              CompletableFuture.runAsync(() -> {
     *         },execute);
     *
     *      2)、支持定时任务线程池;设置 TaskSchedulingProperties
     *        spring.task.scheduling.pool.size: 5
     *
     *      3)、让定时任务异步执行
     *          异步任务
     *
     *      解决:使用异步任务 + 定时任务来完成定时任务不阻塞的功能
     *
     */
     @Async
     @Scheduled(cron = "*/1 * * * * ?")
     public void hello() {
         log.info("hello...");
         try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
     }
}

这样就会开启异步线程,并且是非阻塞线程,因为每次都会开启一个线程来执行,我们可以看一下源码配置的截图,这个就是异步执行的默认配置,核心线程数是8,最大线程数是无限大,这时如果一直每秒执行一次,则会造成服务器资源耗尽。

Java spring定时任务详解

当然,我们可以在配置文件中进行定时任务线程池的设定:

#核心线程数

spring.task.execution.pool.core-size=20

#最大线程数

spring.task.execution.pool.max-size=50

#队列大小

spring.task.execution.pool.queue-capacity=10000

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

Java/Android 相关文章推荐
Java实现多线程聊天室
Jun 26 Java/Android
每日六道java新手入门面试题,通往自由的道路
Jun 30 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
JavaWeb Servlet实现网页登录功能
Jul 04 Java/Android
Spring实现内置监听器
Jul 09 Java/Android
spring boot中nativeQuery的用法
Jul 26 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
java代码实现空间切割
Jan 18 Java/Android
Java实现经典游戏泡泡堂的示例代码
Apr 04 Java/Android
Java Lambda表达式常用的函数式接口
Apr 07 Java/Android
Java 轮询锁使用时遇到问题
May 11 Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 Java/Android
JAVA API 实用类 String详解
Oct 05 #Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 #Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 #Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
Sep 25 #Java/Android
关于springboot配置druid数据源不生效问题(踩坑记)
Sep 25 #Java/Android
Java使用Unsafe类的示例详解
Sep 25 #Java/Android
Spring-cloud Config Server的3种配置方式
Sep 25 #Java/Android
You might like
Php中使用Select 查询语句的实例
2014/02/19 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
理清apply(),call()的区别和关系
2011/08/14 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
JS实现手风琴特效
2020/11/08 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
畜牧兽医本科生的自我评价
2014/03/03 职场文书
食品安全承诺书
2014/05/22 职场文书
节能标语大全
2014/06/21 职场文书
三方股东合作协议书
2014/10/28 职场文书
校运会通讯稿
2015/07/18 职场文书
党员反邪教心得体会
2016/01/15 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
python用tkinter开发的扫雷游戏
2021/06/01 Python
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP