对于服务端同时开启多个定时任务的需求,按照普通的操作方式,springboot单线程的处理方式会造成许多问题,比如两个定时任务时间冲突,只能等一个执行完成在执行另一个;当一个定时任务出现问题,另一个定时任务也无法执行,整个定时任务服务可能会卡死,不再运行。下面所写,通过多线程方式调用定时任务,创建线程池,即可避免任务冲突的情况;

第一步,创建线程池

package com.**.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;/*** @ProjectName: tshare_blsj_server* @Package: com.**.config* @ClassName: TaskPoolConfig* @author: * @description: 线程池配置* @date: * @version: 1.0*/
@EnableAsync
@Configuration
public class TaskPoolConfig {@Bean("tbsjTaskExecutor")public Executor mailNumPoolSingleTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//设置为1,任务顺序执行executor.setCorePoolSize(10);//核心线程数:线程池创建时候初始化的线程数executor.setMaxPoolSize(100);//最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程executor.setQueueCapacity(20);//缓冲队列200:缓冲执行任务的队列executor.setKeepAliveSeconds(60);//允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁executor.setThreadNamePrefix("tbsjTaskExecutor-");//线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());// 线程池对拒绝任务的处理策略return executor;}@Bean("otherSingleTaskExecutor")public Executor otherSingleTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//设置为1,任务顺序执行executor.setCorePoolSize(1);//核心线程数:线程池创建时候初始化的线程数executor.setMaxPoolSize(1);//最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程executor.setQueueCapacity(20);//缓冲队列200:缓冲执行任务的队列executor.setKeepAliveSeconds(60);//允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁executor.setThreadNamePrefix("otherSingleTaskExecutor-");//线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());// 线程池对拒绝任务的处理策略return executor;}
}

第二步:定时任务加注解

package com.**.task;import com.**.service.StationInfoService;
import com.**.service.TshareStationData2Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;/*** @ProjectName: tshare_blsj_server* @Package: com.**.task* @ClassName: Data2NowExceptionTask* @author: * @description:* @date: * @version: 1.0*/@Slf4j
@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
@EnableAsync
public class Data2NowExceptionTask {@Autowiredprivate StationInfoService stationInfoService;@Autowiredprivate TshareStationData2Service tshareStationData2Service;@Scheduled(cron = "0/10 * * * * *")@Async("tbsjTaskExecutor")    // 通过注解指定使用的线程池public void det(){log.info("Scheduled task is running... ...");}
}

控制台打印,定时任务执行,可以看到,每次都是不同线程:

当核心线程(10个)都用完之后,第一个线程所在的定时任务已经执行完成,那么,下一个定时任务将继续使用核心线程池中的第一个线程!

当核心线程(10个)都用完之后,第一个线程所在的定时任务尚未执行完成,将开启新的线程去执行定时任务,直到前面有任务执行完成,下个任务才会使用之前的线程去执行;

Springboot定时任务【多线程处理】相关推荐

  1. SpringBoot定时任务实现的两种方式介绍

    今天给大家介绍SpringBoot定时任务实现的几种方式,希望对大家能有所帮助! 1.SpringTask 用法 框架介绍:SpringTask是Spring自带的轻量级定时任务工具,相比于Quart ...

  2. 开关配置springboot定时任务

    题外话 这是我第五篇原创文章,计划写定时任务内容,想想只要打开自己的有道云笔记,复制粘贴,整理排版一下就能轻松搞定了,这样做有意义吗?自己写文章的价值点是什么呢?考虑了很长时间,主要希望做到一下几点: ...

  3. SpringBoot定时任务(@Scheduled)说明

    转载文章:http://blog.csdn.net/loongshawn/article/details/50663393 1. 定时任务实现方式 定时任务实现方式: Java自带的java.util ...

  4. springBoot 定时任务执行一段时间后失效

    问题描述: springBoot 定时任务执行一段时间后失效,定时任务调用http过一段时间后什么异常也没有 原因:http请求僵死,导致线程也不往下执行,最终导致后面的定时任务也不执行: 解决方法: ...

  5. SpringBoot定时任务简单应用

    SpringBoot定时任务可以用于周期性重复工作的编写,其应用简单,能满足绝大多数需求.在Java中实现定时任务主要有三种实现形式:一是使用JDK 自带的 Timer,二是使用第三方组件 Quart ...

  6. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  7. SpringBoot 定时任务的实现

    介绍两种实现方式:配置实现和读取数据库定时任务配置实现. 配置实现比较简单.直接撸代码: package com; import java.util.Properties; import org.ap ...

  8. springboot定时任务未登录情况下获取用户信息报错解决方案

    解决org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling ...

  9. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    (1)思路说明: (a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度. (b)ThreadPoolTaskSchedule ...

  10. Java 实现 Springboot 定时任务(每隔一段时间自动执行一次)

    Java实现非Web项目的Springboot定时任务(每3秒自动执行一次) 前言 一.新建Java Springboot项目 二.示例代码 运行效果 总结 前言 运行非Web的Springboot项 ...

最新文章

  1. Ubuntu下CodeBlocks的安装、配置及静态库动态库的简单使用举例
  2. 安装hadoop图文
  3. Android移动开发之【Android实战项目】漂亮Button样式
  4. 一位ACMer过来人的心得【转】
  5. python bottle框架 运维_python bottle框架(WEB开发、运维开发)教程 | linux系统运维...
  6. 【转】ABP源码分析四:Configuration
  7. Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
  8. 如何用FineReport制作一张报表(一)
  9. 【C++笔记】变量和基本类型
  10. 3. XML 树结构
  11. loadrunner 操作mysql_loadrunner动态从mysql取值
  12. 抖音代码舞Python制作
  13. war3 魔兽争霸3 双开 多开 联机 补丁 工具
  14. linux开机自动进入安全模式,Linux的安全模式
  15. 平时收集的一些有关UED的团队和个人博客
  16. (十九)论文阅读 | 目标检测之SNIP
  17. docker image 重命名
  18. 微信小程序 —— 自定义picker选择器弹窗内容
  19. 电脑取消撤销快捷键是什么_电脑撤销快捷键是什么?这个万能快捷键适合各种电脑软件...
  20. IOS 制作app 预览视频

热门文章

  1. 什么是防火墙?防火墙的类型和注意事项
  2. python中heapq的库是什么_Python中heapq模块的用法
  3. Windows11自带壁纸位置
  4. 查看计算机.net环境版本,电脑怎么查看.NET Framework版本号?
  5. blob写法的浏览器兼容性
  6. python倒背如流_python基本操作(五)
  7. Xcode9 通过无线链接调试,亲测成功
  8. 安卓和iOS的兼容性问题: 键盘弹起时,固定在底部的按钮是否被弹到键盘上方
  9. (万文)最全、最细前端面试问题总结(答题思路分析、答案解析)
  10. 风湿与类风湿的关系以及风湿病涉及基因突变与基因甲基化的文献收集(仍在更新。。。)