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 相关文章推荐
解决SpringCloud Feign传对象参数调用失败的问题
Jun 23 Java/Android
SpringRetry重试框架的具体使用
Jul 25 Java/Android
Java移除无效括号的方法实现
Aug 07 Java/Android
JAVA API 实用类 String详解
Oct 05 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
JVM之方法返回地址详解
Feb 28 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Android自定义ScrollView实现阻尼回弹
Apr 01 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
volatile保证可见性及重排序方法
Aug 05 Java/Android
OpenFeign实现远程调用
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 函数学习简单小结
2010/07/08 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
深入理解node.js http模块
2018/01/24 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
详解Python中find()方法的使用
2015/05/18 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
印尼旅游网站:via
2017/11/12 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
拾金不昧的表扬信
2014/01/16 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
大专毕业生求职信
2014/07/05 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
捐款通知怎么写
2015/04/24 职场文书