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 相关文章推荐
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
详解Java线程池是如何重复利用空闲线程的
Jun 26 Java/Android
Java SSH 秘钥连接mysql数据库的方法
Jun 28 Java/Android
Spring中bean的生命周期之getSingleton方法
Jun 30 Java/Android
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
Jul 16 Java/Android
springboot 启动如何排除某些bean的注入
Aug 02 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
Java 数据结构七大排序使用分析
Apr 02 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
SpringCloud Function SpEL注入漏洞分析及环境搭建
Apr 08 Java/Android
Java异常体系非正常停止和分类
Jun 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 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
PHP引用返回用法示例
2016/05/28 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
python读取文件名称生成list的方法
2018/04/27 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
重阳节标语大全
2014/10/07 职场文书
党支部鉴定意见
2015/06/02 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
教师节祝酒词
2015/08/11 职场文书
python如何在word中存储本地图片
2021/04/07 Python
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python