java 动态添加 分布式任务_SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)...

一、在JAVA开发领域,目前可以通过以下几种方式进行定时任务

1、单机部署模式

Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行。提供的功能比较单一,无法实现复杂的调度任务。

ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。

Spring Task:Spring提供的一个任务调度工具,支持注解和配置文件形式,支持Cron表达式,使用简单但功能强大。

Quartz:一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度,就是配置稍显复杂。

2、分布式集群模式(不多介绍,简单提一下)

问题:

I、如何解决定时任务的多次执行?

II、如何解决任务的单点问题,实现任务的故障转移?

问题I的简单思考:

1、固定执行定时任务的机器(可以有效避免多次执行的情况 ,缺点就是单点故障问题)。

2、借助Redis的过期机制和分布式锁。

3、借助mysql的锁机制等。

成熟的解决方案:

1、Quartz:可以去看看这篇文章[Quartz分布式]( https://www.cnblogs.com/jiafuwei/p/6145280.html)。

2、elastic-job:(https://github.com/elasticjob/elastic-job-lite)当当开发的弹性分布式任务调度系统,采用zookeeper实现分布式协调,实现任务高可用以及分片。

3、xxl-job:(https://github.com/xuxueli/xxl-job)是大众点评员发布的分布式任务调度平台,是一个轻量级分布式任务调度框架。

4、saturn:(https://github.com/vipshop/Saturn) 是唯品会提供一个分布式、容错和高可用的作业调度服务框架。

二、SpringTask实现定时任务(这里是基于springboot)

1、简单的定时任务实现

使用方式:

使用@EnableScheduling注解开启对定时任务的支持。

使用@Scheduled 注解即可,基于corn、fixedRate、fixedDelay等一些定时策略来实现定时任务。

使用缺点:

1、多个定时任务使用的是同一个调度线程,所以任务是阻塞执行的,执行效率不高。

2、其次如果出现任务阻塞,导致一些场景的定时计算没有实际意义,比如每天12点的一个计算任务被阻塞到1点去执行,会导致结果并非我们想要的。

使用优点:

1、配置简单

2、适用于单个后台线程执行周期任务,并且保证顺序一致执行的场景

源码分析:

//默认使用的调度器

if(this.taskScheduler == null) {

this.localExecutor = Executors.newSingleThreadScheduledExecutor();

this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);

}

//可以看到SingleThreadScheduledExecutor指定的核心线程为1,说白了就是单线程执行

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {

return new DelegatedScheduled

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值