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 相关文章推荐
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
Apr 13 Java/Android
Java设计模式中的命令模式
Apr 28 Java/Android
Spring Boot 实现 WebSocket
Apr 30 Java/Android
java版 简单三子棋游戏
May 04 Java/Android
Java时间工具类Date的常用处理方法
May 25 Java/Android
springboot为异步任务规划自定义线程池的实现
Jun 14 Java/Android
Java 多线程并发FutureTask
Jun 28 Java/Android
Spring boot admin 服务监控利器详解
Aug 05 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
杏林同学录(一)
2006/10/09 PHP
php5.2.0内存管理改进
2007/01/22 PHP
php汉字转拼音的示例
2014/02/27 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
22点关于jquery性能优化的建议
2014/05/28 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
Python实现CET查分的方法
2015/03/10 Python
python paramiko模块学习分享
2017/08/23 Python
Python将string转换到float的实例方法
2019/07/29 Python
Python实现SMTP邮件发送
2020/06/16 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
高级销售员求职信
2013/10/25 职场文书
保证书范文大全
2014/04/28 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL