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定时任务与分布式定时任务相关推荐

  1. 浅谈传统定时任务和分布式定时任务

    为什么用定时任务? 定时任务平台可以在后台自动检测数据并进行操作.主要应用在订单状态改变.后台统计.定时发送邮件或短信等. 定时任务怎么部署实现? 传统的定时任务可以通过可定时线程池.timertas ...

  2. java 项目初始化一个定时任务_elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(一)初始化任务并定时执行...

    第一篇需要实现一个最简单的需求:某个任务定时执行,多台机子只让其中一台机子执行任务 一.安装 分布式应用程序协调服务 zookeeper,安装步骤在链接里面 二.在springboot项目中引入 el ...

  3. 几种主流的分布式定时任务,你知道哪些?

    欢迎关注方志朋的博客,回复"666"获面试宝典 单点定时任务 JDK原生 自从JDK1.5之后,提供了ScheduledExecutorService代替TimerTask来执行定 ...

  4. java分布式定时_分布式定时任务程序

    分布式定时任务程序 介绍 基于zookeeper实现的分布式定时任务程序. 软件架构 包含: 1.zookeeper 2.quartz 3.curator 4.rabbitmq 5.springboo ...

  5. Java 实现分布式定时任务

    文章目录 前言 一.技术点 二.代码实践 1.引入库 2.创建启动线程入口 3.表结构 4.任务解析 5.任务拉取 三.结果展示 四.总结 前言 最近有一个需求:需要实现分布式定时任务.而市面上的定时 ...

  6. quartz 分布式_6大分布式定时任务对比

    作者 | sharedCode 来源 | blog.csdn.net/u012394095/article/details/79470904 分布式定时任务简介 把分散的,可靠性差的计划任务纳入统一的 ...

  7. 聊聊分布式定时任务中间件架构及其实现--转

    原文来自微信公众号:聊聊架构 在互联网应用中,各式各样的定时任务存于系统各个角落.我们希望由一个平台统一将这些作业管理起来.通过这个系统,作业的宕机.崩溃等状态就可收入运维同学掌控,直接对接报警系统, ...

  8. 6大分布式定时任务对比

    作者 | sharedCode 来源 | blog.csdn.net/u012394095/article/details/79470904 分布式定时任务简介 把分散的,可靠性差的计划任务纳入统一的 ...

  9. 基于spring+quartz的分布式定时任务框架

    http://www.cnblogs.com/aaronfeng/p/5537177.html 问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比 ...

  10. 【redis】分布式锁实现,与分布式定时任务

    如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 写在前面 redis辣么多数据结构,这么多命令,具体一点,都可以应用在什么场景呢?用来解决什么具体的问 ...

最新文章

  1. Ubuntu 14.04 64bit上安装Scrapy
  2. 又一所“双一流”清退超33名博士生!今年已有超1300名硕博研究生被清退
  3. Hi35xx GPIO在ko中设置
  4. esxi添加网卡驱动
  5. 前端学习(1262):fetch请求参数
  6. JavaScript中错误正确处理方式,你用对了吗? 1
  7. JavaScript数组拼接、对象拼接
  8. RMS-DC转换器AD8436
  9. 大工18秋计算机文化基础在线测试2,大工18秋《计算机文化基础》在线测试2【答案】...
  10. STM32 Boot 模式和设置介绍
  11. Teams会议聊天中无法添加其他人解决方案
  12. 凡是能用钱买来的时间就是便宜的;凡是能用时间换来的注意力持续就是有价值的。
  13. Junit Rule的使用
  14. php strtolower 大写,PHP strtolower()用法及代码示例
  15. 南京大学计算机学类,并未开放计算机专业:南京大学2020年强基计划政策分析...
  16. 51单片机移植UCOS-II的方法与改进
  17. 留学Essay写作方法从哪里学习?
  18. 2018年11月29日 16点50分 小苗苗出生了
  19. Unity Fog 原理 源码分析 案例
  20. 阅读PDF护眼模式颜色设置

热门文章

  1. linux c如何判断字符串是否为空
  2. 北京科技大学计算机实践,北京科技大学计算机实践报告-Excel 练习
  3. nmap和masscan
  4. 那智机器人调试步骤总结
  5. WIN7封装教程2018系列(二)—必要的系统调整
  6. TTL与RS-232电平转换芯片MAX232/MAX3232
  7. 【强大的数字设计工具包】Sketch 55.1 for Mac
  8. 【最新】python爬取全国主要城市经纬度
  9. html audio解决浏览器无法播放问题
  10. Linux常用编程工具