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 相关文章推荐
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
java设计模式--建造者模式详解
Jul 21 Java/Android
Java数据开发辅助工具Docker与普通程序使用方法
Sep 15 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 Java/Android
解决springboot druid数据库连接失败后一直重连的方法
Apr 19 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
Java中Dijkstra(迪杰斯特拉)算法
May 20 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
ThinkPHP php 框架学习笔记
2009/10/30 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
php常用字符函数实例小结
2016/12/29 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
python word转pdf代码实例
2019/08/16 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
几个判断型的面试题
2012/07/03 面试题
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
公务员培训心得体会
2013/12/28 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
关于做家务的心得体会
2016/01/23 职场文书
《迟到》教学反思
2016/02/24 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
Redis+AOP+自定义注解实现限流
2022/06/28 Redis