前言:
而今咱们对“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定时发送请求