龙空技术网

SpringBoot通过@Scheduled注解+多线程实现定时任务

悠闲一蓑烟雨 310

前言:

而今咱们对“java定时发送请求”都比较注意,咱们都想要了解一些“java定时发送请求”的相关文章。那么小编同时在网上搜集了一些对于“java定时发送请求””的相关知识,希望同学们能喜欢,同学们一起来了解一下吧!

在日常工作中,经常会遇到一些定时任务,比如定时发邮件、异构数据库同步数据等。本例为SpringBoot使用Scheduled注解+多线程实现定时任务

1.引入相关依赖

   <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <!-- 导入lombok组件简化代码 -->        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <scope>provided</scope>		<!-- 只在编译阶段生效,不需要打入包中-->        </dependency>        <!--导入hutool工具类 -->        <dependency>            <groupId>cn.hutool</groupId>            <artifactId>hutool-all</artifactId>            <version>5.1.0</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>    <!-- 将项目打包成可执行jar包-->    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <!-- 如果没有配置fork属性,热部署不会起效-->                <configuration>                    <fork>true</fork>                </configuration>            </plugin>        </plugins>    </build>

2.在application.yml中配置线程池

#线程池配置schedule:  #线程配置  pool:    #核心线程数:没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的2倍加1    corePoolSize: 3    #最大线程数:没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的3倍    maxPoolSize: 5    #线程池所使用的缓冲队列长度:没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的3倍    queueCapacity: 5    #空闲线程最大存活时间:没有配置、配置为空或-1时则为60秒;    KeepAliveSeconds: 5    #定时任务频率配置

3.创建线程池配置类ThreadPoolConfig.java,注入配置文件中的线程池参数

package com.wwu.schedule.config;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.util.StringUtils;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;/** * @author 一蓑烟雨 * @version 1.0.0 * @date 2023-04-15 12:07 **/@Configurationpublic class ThreadPoolConfig {    /** 获取当前系统CPU数目 */    private static int cpuNums = Runtime.getRuntime().availableProcessors();    /** 核心线程数(线程池维护线程的最少数量),默认为1 */    @Value("${schedule.pool.corePoolSize:1}")    private String corePoolSize;    /** 最大线程数(线程池维护线程的最大数量),默认为1 */    @Value("${schedule.pool.maxPoolSize:1}")    private String maxPoolSize;    /** 线程池所使用的缓冲队列长度(大于等于最大线程),默认为1 */    @Value("${schedule.pool.queueCapacity:1}")    private String queueCapacity;    /** 设置空闲线程最大存活时间(超出核心线程数量的线程回收),默认为60秒 */    @Value("${schedule.pool.KeepAliveSeconds:60}")    private String KeepAliveSeconds;    @Bean    public Executor taskExecutor() {        System.out.println("...获取当前系统CPU数目:"+cpuNums);        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        //设置核心线程数:没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的2倍加1        executor.setCorePoolSize(!StringUtils.hasLength(corePoolSize)                ? 1 : (corePoolSize.equals("-1") ? cpuNums*2+1 : Integer.parseInt(corePoolSize)));        //设置最大线程数:没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的3倍        executor.setMaxPoolSize(!StringUtils.hasLength(maxPoolSize)                ? 1 : (maxPoolSize.equals("-1") ? cpuNums*3 : Integer.parseInt(maxPoolSize)));        //设置线程池队列长度:没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的3倍        executor.setQueueCapacity(!StringUtils.hasLength(queueCapacity)                ? 1 : (queueCapacity.equals("-1") ? cpuNums*3 : Integer.parseInt(queueCapacity)));        //设置空闲线程最大存活时间:没有配置、配置为空或-1时则为60;        executor.setKeepAliveSeconds(!StringUtils.hasLength(KeepAliveSeconds)||KeepAliveSeconds.equals("-1")                ? 60 : Integer.parseInt(KeepAliveSeconds));        //设置空闲线程回收策略:false表示当线程数达到核心线程时就不再回收,true表示空闲线程回收直到线程数为0        executor.setAllowCoreThreadTimeOut(false);        //线程池拒绝策略        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        //设置线程名称前缀        executor.setThreadNamePrefix("springboot-quartz-thread");        //线程池初始化        executor.initialize();        return executor;    }}

3.创建定时任务管理器ScheduleManager.java,编写业务逻辑及在相应的方法上面增加@Scheduled配置执行规则

package com.wwu.schedule.config;import cn.hutool.core.date.DateUtil;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;/** * 定时任务管理器,Async注解表示该类中的方法异步执行 * @author 一蓑烟雨 * @version 1.0.0 * @date 2023-04-15 12:06 **/@Component@Asyncpublic class ScheduleManager {    @Scheduled(cron = "0/20 * * * * ?")    public void FirstJob() {        System.out.println(DateUtil.date() +"--"+Thread.currentThread().getName()+"--第1个定时任务启动");        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println(DateUtil.date() +"--"+Thread.currentThread().getName()+"--第1个定时任务结束");    }    @Scheduled(cron = "0/20 * * * * ?")    public void SecondJob() {        System.out.println(DateUtil.date() +"--"+Thread.currentThread().getName()+"--第2个定时任务启动");        try {            Thread.sleep(8000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println(DateUtil.date() +"--"+Thread.currentThread().getName()+"--第2个定时任务结束");    }}

5.修改启动类SpringBootScheduleApplication.java,增加开启定时任务注解@EnableScheduling和开启异步注解@EnableAsync

package com.wwu.schedule;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication/** 开启定时任务注解 */@EnableScheduling/** 开启异步注解 */@EnableAsyncpublic class SpringBootScheduleApplication {    public static void main(String[] args) {        SpringApplication.run(SpringBootScheduleApplication.class, args);    }}

6.启动项目,定时任务即可执行

标签: #java定时发送请求