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异常处理流程及原理
Jun 21 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
关于maven依赖 ${xxx.version}报错问题
Jan 18 Java/Android
正则表达式拆分url实例代码
Feb 24 Java/Android
Java 超详细讲解设计模式之中的抽象工厂模式
Mar 25 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
springboot实现string转json json里面带数组
Jun 16 Java/Android
java实现自定义时钟并实现走时功能
Jun 21 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
Java使用HttpClient实现文件下载
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中Smarty模板初体验
2011/08/08 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
PHP微信API接口类
2016/08/22 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
Jquery 弹出层插件实现代码
2009/10/24 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
python通过线程实现定时器timer的方法
2015/03/16 Python
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
Python 一句话生成字母表的方法
2019/01/02 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
大学自荐信
2013/12/12 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
单位在职证明书
2014/09/11 职场文书
信访工作汇报材料
2014/10/27 职场文书
2014年班组长工作总结
2014/11/20 职场文书
先进个人事迹材料
2014/12/29 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL