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 相关文章推荐
Springboot如何使用logback实现多环境配置?
Jun 16 Java/Android
Spring boot应用启动后首次访问很慢的解决方案
Jun 23 Java/Android
Java 数组内置函数toArray详解
Jun 28 Java/Android
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
Jul 26 Java/Android
使用Spring处理x-www-form-urlencoded方式
Nov 02 Java/Android
Java8中Stream的一些神操作
Nov 02 Java/Android
使用Java去实现超市会员管理系统
Mar 18 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
springboot入门 之profile设置方式
Apr 04 Java/Android
Android自定义双向滑动控件
Apr 19 Java/Android
java版 简单三子棋游戏
May 04 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中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
python实现马耳可夫链算法实例分析
2015/05/20 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Python的time模块中的常用方法整理
2015/06/18 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
python计算两个数的百分比方法
2018/06/29 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
python轮询机制控制led实例
2020/05/03 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
linux面试题参考答案(4)
2013/01/28 面试题
大学生求职中的自我评价
2013/10/01 职场文书
高中校园广播稿
2014/01/11 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
清洁工岗位职责
2015/02/13 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
立春观后感
2015/06/18 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
Python何绘制带有背景色块的折线图
2022/04/23 Python