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
dubbo服务整合zipkin详解
Jul 26 Java/Android
java多态注意项小结
Oct 16 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Apr 07 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Apr 26 Java/Android
mybatis 获取更新记录的id
May 20 Java/Android
Java中Dijkstra(迪杰斯特拉)算法
May 20 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 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代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
php计算整个目录大小的方法
2015/06/01 PHP
PHP实现事件机制的方法
2015/07/10 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
python 实现对文件夹内的文件排序编号
2018/04/12 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
Python3.9新特性详解
2020/10/10 Python
Python内置函数及功能简介汇总
2020/10/13 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
华为python面试题
2016/05/03 面试题
导游个人求职信
2014/04/25 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
优秀党员申报材料
2014/12/18 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
详解Vue3使用axios的配置教程
2022/04/29 Vue.js
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS