首页 > 其他分享 >spring和springboot定时任务线程池配置

spring和springboot定时任务线程池配置

时间:2023-11-23 16:12:47浏览次数:35  
标签:springboot spring 配置 nagiumi 线程 scheduler ------ CST Nov

spring和springboot定时任务线程池配置

目录

1 背景

项目有几个新增的月末报表生成定时任务(使用spring内置的TaskScheduler),相关业务人员反馈报表没有及时生成,让我比较疑惑:虽然生成比较耗时,但是我凌晨就开始跑任务了,怎么能到了中午还没有数据呢?经检查,发现项目没有给定时任务配置定时任务线程池,导致所有的定时任务异步进行,好几个定时任务排队等待启动。一个任务按一小时算,累计下来所有任务跑完花了好几个小时,导致排在后面的定时任务没有按时启动,也没有及时生成文件。所以需要给定时任务配置线程池。

2 配置

2.1 命名空间配置

因为我的项目还在使用spring,所以使用xml命名空间的方式去进行配置。在xml中可以配置打开@Scheduled注解的支持,以及配置定时任务线程池的名称、大小。首先新建一个xml文件,我这里命名为spring-task.xml,然后写入如下代码:

xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">

    <!--开启注解支持-->
    <task:annotation-driven scheduler="nagiumi-namespace-scheduler"/>
    <!--定时任务线程池配置-->
    <task:scheduler id="nagiumi-namespace-scheduler" pool-size="2"/>
</beans>

我这里就配置了一个大小为2的线程池,名称为nagiumi-namespace-scheduler。接下来写两个测试用的定时任务,其中一个每秒打印一次内容,另一个每5秒打印一次内容并阻塞4秒。如果定时任务仍然是异步的,那么前者就会受到后者阻塞的影响。如果线程池配置生效则不会受到影响。记得将spring-task.xml配置文件用@ImportResource注解导入或者配置contextConfigLocation路径来使配置生效。

测试任务

@Component
public class ScheduleTest {

    @Scheduled(cron = "* * * * * ?")
    public void run1() {
        System.out.println(Thread.currentThread().getName() + "------run1···" + new Date());
    }

    @Scheduled(cron = "0/5 * * * * ?")
    public void run2() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + "------run2···" + new Date());
        Thread.sleep(4000);
    }
}

输出结果

nagiumi-namespace-scheduler-1------run1···Thu Nov 23 15:13:38 CST 2023
nagiumi-namespace-scheduler-1------run1···Thu Nov 23 15:13:39 CST 2023
nagiumi-namespace-scheduler-1------run1···Thu Nov 23 15:13:40 CST 2023
nagiumi-namespace-scheduler-2------run2···Thu Nov 23 15:13:40 CST 2023
nagiumi-namespace-scheduler-1------run1···Thu Nov 23 15:13:41 CST 2023
nagiumi-namespace-scheduler-1------run1···Thu Nov 23 15:13:42 CST 2023

可以看出来两个定时任务没有互相干扰,利用两个线程实现了同步执行。

2.2 yaml配置

毕竟现在springboot比spring更加主流,我自己也在尽量多熟悉springboot的开发风格,所以也简单了解了一下yaml配置方式。这次直接在默认的application.yml中进行配置:

yaml配置

spring:
  task:
    scheduling:
      pool:
        size: 2
      thread-name-prefix: nagiumi-yaml-scheduler-

springboot也可以继续使用xml配置,用@ImportResource注解将配置文件导入启动类即可。

配置的内容和之前等效。测试代码同上。springboot想要启动注解支持,在启动类上添加@EnableScheduling即可。

输出结果

nagiumi-yaml-scheduler-1------run1···Thu Nov 23 15:42:54 CST 2023
nagiumi-yaml-scheduler-2------run2···Thu Nov 23 15:42:55 CST 2023
nagiumi-yaml-scheduler-1------run1···Thu Nov 23 15:42:55 CST 2023
nagiumi-yaml-scheduler-1------run1···Thu Nov 23 15:42:56 CST 2023
nagiumi-yaml-scheduler-1------run1···Thu Nov 23 15:42:57 CST 2023
nagiumi-yaml-scheduler-1------run1···Thu Nov 23 15:42:58 CST 2023

测试结果没有问题,实现了同步执行。

3 参考文档

https://springdoc.cn/spring/integration.html#scheduling

标签:springboot,spring,配置,nagiumi,线程,scheduler,------,CST,Nov
From: https://www.cnblogs.com/nagiumi-misaka/p/17851779.html

相关文章

  • 进程、线程的中断切换的过程
    上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换进程上下文切换(1)保护被中断进程的处理器现场信息(2)修改被中断进程的进程控制块有关信息,如进程状态等(3)把被中断进程的进程控制块加入有关队列(4)选择下一个占有处理器运行的进程(5)根据被选中进程设置操作系统用......
  • 线程
    目录Thread线程一、线程创建的三种方式方式一:继承Thread类的方式进行实现方式二:实现Runnable接口的方式进行实现方式三:利用Callable接口和Future接口方式实现二、Thread状态三、异步ComletableFuture入门Thread线程视频地址:https://www.bilibili.com/video/BV1LG4y1T7n2/?p=5&......
  • java 实现文件夹上传(springBoot 框架)
    java实现文件夹上传(springBoot框架)有时我们后台管理等服务可能会有这样一个简单需求,就是根据文件夹将整个文件夹下的所有资源都上传到我们的服务器上,本人也是搜索了大量资料,最终以最简单便捷的方式实现该功能,具体操作步骤如下一、前端如何设置上传组件并将资源上传到后台服务这......
  • org.springframework.context.ApplicationContextException: Failed to start bean ‘
    错误信息org.springframework.context.ApplicationContextException:Failedtostartbean'documentationPluginsBootstrapper';nestedexceptionisjava.lang.NullPointerException  atorg.springframework.context.support.DefaultLifecycleProcessor.doStar......
  • 使用jasypt对springboot配置信息加密
    1.pom文件增加依赖<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>2.修改启动......
  • 通过Spring MVC 实现 Restful 风格请求⽀持
     通过SpringMVC可以很方便地实现Restful风格的请求支持。Restful风格的请求是一种基于HTTP协议的轻量级的Web服务架构风格,它通过HTTP的GET、POST、PUT、DELETE等方法来实现对资源的增删改查操作。在SpringMVC中,我们可以使用注解来定义Restful风格的请求处理方法,并且可以方便......
  • 手把手教你玩转 SpringBoot 日志
    本文根据文章:https://lebron.blog.csdn.net/article/details/132953586?spm=1001.2014.3001.5502进行修改一、日志重要吗程序中的日志重要吗?在回答这个问题前,笔者先说个事例:笔者印象尤深的就是去年某个同事,收到了客户反馈的紧急bug。尽管申请到了日志文件,但因为很多关键步骤......
  • Spring中@Mapper和@Repository的区别与使用
    本文根据文章:https://blog.csdn.net/m0_45210394/article/details/126223145进行修改@Mapper是mybatis的注解,标注在dao层接口上,可以通过动态代理生成接口的实例bean(编译之后能生成相应的接口实现类)@Repository是spring的注解,也标注在dao层接口上,但是@Repository注解只是表明这......
  • C++11线程传递参数汇总
    一、概述总结C++11线程传递参数:1.传递基本数据类型(int、double)2.传递字符串3.传递结构体4.传递类对象二、代码示例//导入线程头文件#include<thread>//导入std命名空间usingnamespacestd;//传递int类型的参数voidthreadFu......
  • Bean instantiation via constructor failed; nested exception is org.springframewo
    一、从公司的的GitLab下载项目到本地二、nacos-2.0.1启动不了我以为是我中文路径问题,然后放到全是英文的一样报错,百度一圈没找到解决方法。三、大佬路过,瞟了我一眼的电脑解决了。删除D:\nacos-2.0.0\data 下面的所有文件即可 原因就是有人把自己的数据上传到git了,导致......