ThreadPoolTaskScheduler轻量级多线程定时任务框架
admin
2024-01-21 04:46:44
0

ThreadPoolTaskScheduler轻量级多线程定时任务框架

  • 前言
  • 一、ThreadPoolTaskScheduler是什么?
  • 二、上干货
    • 1.ThreadPoolTaskScheduler常用的api介绍
    • 2.springboot中创建配置类
    • 3.实现Runnable的业务处理类
    • 4.业务处理服务service
    • 5.调用controller
    • 6.让我们看看运行结果
  • 总结


前言

面对一些小的功能需求点,如果需要非常灵活的进行处理定时任务处理,但是又因为你的需求需要使用到页面进行定时任务配置,显然使用Spring注解定时任务,无法满足你,这时你想到了xxl-job 或者 quezy等定时任务框架,但是过于繁琐,可能成本较大。那么本文将要解决你的问题。


一、ThreadPoolTaskScheduler是什么?

  • springboot中有一个bean,ThreadPoolTaskScheduler,可以很方便的对重复执行的任务进行调度管理;相比于通过java自带的周期性任务线程池
  • ScheduleThreadPoolExecutor,此bean对象支持根据cron表达式创建周期性任务。
  • 当然,ThreadPoolTaskScheduler其实底层使用也是java自带的线程池。

二、上干货

1.ThreadPoolTaskScheduler常用的api介绍

ThreadPoolTaskScheduler 内部方法非常丰富,本文实现的是一种corn表达式,周期执行

  • schedule(Runnable task, Trigger trigger) corn表达式,周期执行
  • schedule(Runnable task, Date startTime) 定时执行
  • scheduleAtFixedRate(Runnable task, Date startTime, long period)
    定时周期间隔时间执行。间隔时间单位 TimeUnit.MILLISECONDS
  • scheduleAtFixedRate(Runnable task, long period) 间隔时间执行。单位毫秒

2.springboot中创建配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration
public class TaskConfig {//配置定时任务线程池-自定义名称避免冲突@Bean(name = "myThreadPoolTaskScheduler")public ThreadPoolTaskScheduler threadPoolTaskScheduler() {ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();executor.setPoolSize(2);executor.setThreadNamePrefix("task-");executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(60);return executor;}}

3.实现Runnable的业务处理类

代码如下(示例):

@Slf4j
public class RunSameThing implements Runnable{@Overridepublic void run() {log.info("===我执行了===");}
}

4.业务处理服务service

import java.util.concurrent.ScheduledFuture;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;@Service
@Slf4j
public class CommonTask {@Resource(name = "myThreadPoolTaskScheduler")private ThreadPoolTaskScheduler taskScheduler;private ScheduledFuture future;//开启任务public void startTask(){//每次调用前,可执行一次关闭之前的stop();//每秒执行-corn 表达式可传参形式String cron = "0/1 * * * * ?";//RunSameThing 为执行的业务逻辑future = taskScheduler.schedule(new RunSameThing(), new CronTrigger(cron));}//关闭任务public void stop() {if (future != null) {log.info("我关闭了");future.cancel(true);}}
}

5.调用controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/task")
public class TestTaskController {@Autowiredprivate CommonTask commonTask;@RequestMapping("start")public void startTask(){commonTask.startTask();}@RequestMapping("end")public void endTask(){commonTask.stop();}}

6.让我们看看运行结果


task-1] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing    : ===我执行了===
[nio-8080-exec-2] com.easy.wheel.scheduler.CommonTask      : 我关闭了

线程池配置的两个线程,可以看到task-1 和 task-2 交替支持,达到了我们想要的效果,关闭也能正常进行关闭,nice。这个轮子搞定了,下次写代码直接复制。巴适


总结

生活不能止步不前,为了更多的时间陪陪家人,轮子用起来啊,亲

相关内容

热门资讯

阿里千问App全球首发点外卖、... 1月15日,阿里举行千问App发布会, 阿里巴巴(BABA.US)集团副总裁吴嘉宣布,千问App全面...
携程港股、美股放量跌近20% 【大河财立方消息】1月15日,携程港股、美股双双大跌。 截至发稿,港股携程集团跌幅18.53%,美股...
淳厚基金获国资入主!管理规模缩... 淳厚基金获得长宁国投入主,但是市场声誉遭遇重挫,机构投资者纷纷撤出。 文/每日财报 楚风 随着国有...
「死了么」爆火,1亿独居群体被... 「核心提示」 独居时代下的深层焦虑,让“死了么”迎来短暂流量狂欢。不过,这款低门槛应用,拿什么...
2025年我国跨境电商进出口2... 一、明星品牌 1、美国奢侈品零售商萨克斯环球申请破产保护 美国高端百货集团萨克斯环球(Saks Gl...
卫龙前CEO孙亦农入职大窑出任... 红星资本局1月15日消息,红星资本局从大窑处了解到,卫龙(09985.HK)前CEO孙亦农已加入大窑...
市场利好持续提振港股医药股 东... 财联社1月15日讯(编辑 胡家荣)今日港股医药板块迎来强劲反弹,多只个股表现亮眼。截至发稿,东曜药业...
技术派登顶!2026浙江危机公... 2026年危机公关行业正经历近十年来最深刻的范式革命。当抖音热搜的存活周期缩短至3小时、AI生成虚假...
雷军官宣今晚直播:与汽车媒体一... 2026年1月15日,小米创办人,董事长兼CEO雷军在社交媒体平台发文称,“上次直播后,很多网友希望...
阿里千问宣布接入淘宝、支付宝、... 1月15日,阿里千问App宣布全面接入淘宝、支付宝、淘宝闪购、飞猪、高德等阿里生态业务,在全球首先实...
黄金投资交易入门:定义与风险评... 黄金投资交易是以黄金为交易标的的金融投资行为,核心是通过把握黄金价格的波动规律,以低买高卖的方式赚取...
第六批高值医用耗材集采开标,涉... 图片来源:视觉中国 蓝鲸新闻1月14日讯(记者 屠俊)据国家医保局官微信息显示,1月13日,第六批国...
瑞银:中国AI不堆卡、重效率,... “中国AI行业不存在美国式泡沫,反而将在模型出海、应用爆发、算力替代三大主线迎来系统性机遇。”1月1...
小鹏汇天冲击港股IPO:低空经... 2026年刚刚开始,小鹏汇天秘密提交港股IPO申请的消息就不胫而走。 有知情人士透露,小鹏汽车已聘请...
原创 马... 这将是一段动荡的旅程。 一 几周前,美国德州特斯拉超级工厂内,马斯克接受一次特殊访谈,预言2026。...
梁文锋旗下幻方量化,去年收益率... 每经记者|杨建 每经编辑|何小桃 叶峰 2025年A股市场持续火热,百亿私募交出了怎样的成绩单?据...
宽基ETF规模大增的三大理由 2026年,A股市场开局向好。Wind资讯数据显示,截至1月14日,开年以来ETF总规模增长超220...
冬季护眼 “睛”彩相伴|武汉普... 冬季天气寒冷干燥,室内取暖设备的使用让空气湿度降低,加上户外活动减少、长时间近距离用眼成为常态,干眼...
白银首破92美元,金铜锡拉升创... 2026年开年以来,全球金属市场迎来新一轮狂欢。 1月14日亚太交易时段,现货白银(伦敦银现)史上首...