Java定时任务与分布式定时任务
Java定时任务与分布式定时任务
文章目录
- Java定时任务与分布式定时任务
- 1. JDK原生
- 2. Spring
- 3.Spring + 数据库
- 4.Spring+Redis
- 5.分布式定时任务
- RabbitMQ
- quartz
- elastic-job-lite
- xxl-job
业务场景:
- 订单下单之后
15分钟
后,用户未付款,系统需要自动取消订单
。 - 红包
24小时
未被查收,需要延迟执退还
业务; - 超过7天,
自动收货
1. JDK原生
使用JUC
提供的newScheduledThreadPool
来执行定时任务
public class ScheduledExecutor {public static void main(String[] args) {// 创建任务队列,起10个线程ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);// 执行任务:1秒 后开始执行,每5秒执行一次scheduledExecutorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println("执行任务: "+new Date());}},1,5, TimeUnit.SECONDS);}
}
2. Spring
使用Spring提供的@Scheduled
配置任务类,在启动类上添加@EnableScheduling
@Component
public class ScheduleWork {@Scheduled(cron = "5/3 * * * * ? ")public void doJob() {System.out.println("spring 定时器 :"+ new Date());}
}
// 启动类加上注解,表示启用定时任务
@EnableScheduling
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
或者使用@Configuration
定义配置类注解,在任务类上同时使用@EnableScheduling
和@Scheduled
@Configuration
@EnableScheduling
public class SomeJob {@Scheduled(cron = "5/3 * * * * ? ")public void someTask() {System.out.println("更改注解位置的方式 ");}
}
这种方式有个缺点,那就是执行周期写死在代码里了,没有办法动态改变,要想改变只能修改代码在重新部署启动微服务.
3.Spring + 数据库
启动类
@EnableScheduling @SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }
配置类
@Configuration public class ScheduleConfig implements SchedulingConfigurer {@Autowiredprivate ApplicationContext context;@Autowiredprivate SpringScheduleService scheduleService;@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {// 查询出所有的任务列表,这里使用的是mybatis,查询的MySQL数据库、List<SpringScheduledCron> workList = scheduleService.findAllWorkList();for (SpringScheduledCron scheduledCron : workList) {Class<?> clazz;Object task;try {// 使用反射获取Class类对象clazz = Class.forName(scheduledCron.getCronKey());// 获取spring容器中初始化的bean对象task = context.getBean(clazz);} catch (ClassNotFoundException e) {throw new IllegalArgumentException("该class有误:"+scheduledCron.getCronKey() + "----",e);}// 所有定时任务类在微服务启动的时候,就会被自动注册到Spring的定时任务里// 动态改变执行周期scheduledTaskRegistrar.addTriggerTask((Runnable) task,triggerContext -> {// 获取定时任务表达式,执行时间String cronExpression = scheduleService.findByCronKey(scheduledCron.getCronKey()).getCronExpression();return new CronTrigger(cronExpression).nextExecutionTime(triggerContext);});}}// 开启线程池,去处理多个定时任务@Beanpublic Executor taskExecutor() {return Executors.newScheduledThreadPool(10);} }
任务类
@Component public class DynamicTask implements Runnable {private Logger logger = LoggerFactory.getLogger(getClass());private int i;@Overridepublic void run() {logger.info("Task---线程 id :{}, 任务执行 :{}",Thread.currentThread().getId(),++i);} }
4.Spring+Redis
同上,只是将原本放在关系型数据中的任务列表,存储在Redis
中
5.分布式定时任务
RabbitMQ
最适合此类场景的,是使用消息队列的延迟队列
。可以查看这篇文章:《RabbitMQ消息中间件技术精讲(五)》
quartz
依赖于MySQL,使用相对简单,可多节点部署,通过竞争数据库锁来保证只有一个节点执行任务。没有图形化管理页面,使用相对麻烦。
elastic-job-lite
依赖于Zookeeper,通过zookeeper的注册与发现,可以动态的添加服务器。
xxl-job
国产,依赖于MySQL,基于竞争数据库锁保证只有一个节点执行任务,支持水平扩容。可以手动增加定时任务,启动和暂停任务。
参考文章:
《在Spring Boot中优雅的实现定时任务》
《【每日鲜蘑】分布式环境下的定时任务》
Java定时任务与分布式定时任务相关推荐
- 浅谈传统定时任务和分布式定时任务
为什么用定时任务? 定时任务平台可以在后台自动检测数据并进行操作.主要应用在订单状态改变.后台统计.定时发送邮件或短信等. 定时任务怎么部署实现? 传统的定时任务可以通过可定时线程池.timertas ...
- java 项目初始化一个定时任务_elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(一)初始化任务并定时执行...
第一篇需要实现一个最简单的需求:某个任务定时执行,多台机子只让其中一台机子执行任务 一.安装 分布式应用程序协调服务 zookeeper,安装步骤在链接里面 二.在springboot项目中引入 el ...
- 几种主流的分布式定时任务,你知道哪些?
欢迎关注方志朋的博客,回复"666"获面试宝典 单点定时任务 JDK原生 自从JDK1.5之后,提供了ScheduledExecutorService代替TimerTask来执行定 ...
- java分布式定时_分布式定时任务程序
分布式定时任务程序 介绍 基于zookeeper实现的分布式定时任务程序. 软件架构 包含: 1.zookeeper 2.quartz 3.curator 4.rabbitmq 5.springboo ...
- Java 实现分布式定时任务
文章目录 前言 一.技术点 二.代码实践 1.引入库 2.创建启动线程入口 3.表结构 4.任务解析 5.任务拉取 三.结果展示 四.总结 前言 最近有一个需求:需要实现分布式定时任务.而市面上的定时 ...
- quartz 分布式_6大分布式定时任务对比
作者 | sharedCode 来源 | blog.csdn.net/u012394095/article/details/79470904 分布式定时任务简介 把分散的,可靠性差的计划任务纳入统一的 ...
- 聊聊分布式定时任务中间件架构及其实现--转
原文来自微信公众号:聊聊架构 在互联网应用中,各式各样的定时任务存于系统各个角落.我们希望由一个平台统一将这些作业管理起来.通过这个系统,作业的宕机.崩溃等状态就可收入运维同学掌控,直接对接报警系统, ...
- 6大分布式定时任务对比
作者 | sharedCode 来源 | blog.csdn.net/u012394095/article/details/79470904 分布式定时任务简介 把分散的,可靠性差的计划任务纳入统一的 ...
- 基于spring+quartz的分布式定时任务框架
http://www.cnblogs.com/aaronfeng/p/5537177.html 问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比 ...
- 【redis】分布式锁实现,与分布式定时任务
如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 写在前面 redis辣么多数据结构,这么多命令,具体一点,都可以应用在什么场景呢?用来解决什么具体的问 ...
最新文章
- Ubuntu 14.04 64bit上安装Scrapy
- 又一所“双一流”清退超33名博士生!今年已有超1300名硕博研究生被清退
- Hi35xx GPIO在ko中设置
- esxi添加网卡驱动
- 前端学习(1262):fetch请求参数
- JavaScript中错误正确处理方式,你用对了吗? 1
- JavaScript数组拼接、对象拼接
- RMS-DC转换器AD8436
- 大工18秋计算机文化基础在线测试2,大工18秋《计算机文化基础》在线测试2【答案】...
- STM32 Boot 模式和设置介绍
- Teams会议聊天中无法添加其他人解决方案
- 凡是能用钱买来的时间就是便宜的;凡是能用时间换来的注意力持续就是有价值的。
- Junit Rule的使用
- php strtolower 大写,PHP strtolower()用法及代码示例
- 南京大学计算机学类,并未开放计算机专业:南京大学2020年强基计划政策分析...
- 51单片机移植UCOS-II的方法与改进
- 留学Essay写作方法从哪里学习?
- 2018年11月29日 16点50分 小苗苗出生了
- Unity Fog 原理 源码分析 案例
- 阅读PDF护眼模式颜色设置