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中重写父类方法加不加@Override详解
Jun 21 Java/Android
Java基础-封装和继承
Jul 02 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 Java/Android
java协程框架quasar和kotlin中的协程对比分析
Feb 24 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
Apr 13 Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 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
如何做到多笔资料的同步
2006/10/09 PHP
php动态生成JavaScript代码
2009/03/09 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
基于jquery的表头固定的若干方法
2011/01/27 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
Python中除法使用的注意事项
2014/08/21 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
初一地理教学反思
2014/01/16 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
如何写求职信
2014/05/24 职场文书
房产证明范本
2015/06/19 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏