[原]BlockingQueue在任务调度中的精彩应用

标签: | 发表时间:2017-11-05 12:17 | 作者:bluishglc
出处:http://blog.csdn.net/bluishglc

问题来了…

我们正在构建的系统需要从外部第三方系统中采集数据,受不可控的外部环境的影响,我们的数据采集工作经常被阻塞,一种典型的情况是:某个目标数据库因为要同时处理多个外围系统叠加的查询请求而经常响应缓慢,从而导致我们的Job严重超时,而这个Job原有的设计是每5分钟执行一次,每次执行时会从目标数据库中查询最近5分钟内的数据,通常情况下这种简单的设计没有问题,但是当前一个Job严重超时时,后续启动的Job仍然以启动时的前5分钟作为时间窗口进行查询,就会导致数据丢失。 本文原文出处: 本文原文链接: http://blog.csdn.net/bluishglc/article/details/78447813 转载请注明出处。

异步执行?

一个简单的解决方案是将Job的执行变为异步非阻塞模式,每一个Job被触发时都在一个独立的线程中运行。但是这个方案不适用于我们的系统,原因是这样采集的数据无法保证按时间有序,而确保数据按时间有序对我们的系统至关重要。所以这一方案被否决。

最佳方案!

经过仔细的思考,我们认为必须要将这个Job切分成两个子的Job:第一个Job负责制定周期性的计划,准确地说是周期性地生成查询的时间参数,第二个Job则负责读取时间参数执行查询,这一部分的工作并不是周期性的,原则上,只要有时间参数生成就应该立即执行,如果执行超时,在超时期间,我们需要缓存第一个Job生成的时间参数,而当所有的查询都及时完成没有Pending的查询计划时,第二个Job需要等待新的查询参数到达。到这里事情已经变得很明朗了,我们实际上设计的是一个 生产者-消费者模型,只是生产者在“有节奏”的生产,那么在这个模式里,作为第三个参与者:仓库,或者说传送带,就是起最关键作用的,而 BlockingQueue就是一个现成的完美实现,于是落地的方案就是:

  1. 第一个Job由定时器周期性触发,每次触发时会把当前时间写入到一个BlockingQueue的队尾。

  2. 第二个Job循环执行,每次执行的工作就是从BlockingQueue的队头取出时间参数,组装SQL并执行。

    2.1. 当队列为空时,由BlockingQueue来Pending当前线程,等待时间参数进入队列。

  3. 当第二个Job执行完一次时,如果队列中还有时间参数,会立即执行第二次,发生此类情况时就说明前一次的执行超过了5分钟。

作者:bluishglc 发表于2017/11/5 10:04:38 原文链接
阅读:62 评论:0 查看评论

相关 [blockingqueue 任务 调度] 推荐:

[原]BlockingQueue在任务调度中的精彩应用

- - Laurence的技术博客
本文原文出处: 本文原文链接: http://blog.csdn.net/bluishglc/article/details/78447813 转载请注明出处. 一个简单的解决方案是将Job的执行变为异步非阻塞模式,每一个Job被触发时都在一个独立的线程中运行. 但是这个方案不适用于我们的系统,原因是这样采集的数据无法保证按时间有序,而确保数据按时间有序对我们的系统至关重要.

Spark 任务调度

- - IT瘾-dev
 Spark的核心是基于RDD来实现的,Spark任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建DAG,基于DAG划分Stage,然后将每个Stage中的任务(Task)分发到指定的节点去运行得到最终的结果. Application:用户编写的Spark应用程序,由一个或多个Job组成.

使用Quartz和Obsidian来调度任务

- - Java译站
在介绍使用到的Quartz和Obsidian的API之前,首先我得声明一下,一般来说使用API并不是调度任务的最佳方式. Quartz提供了一个通过XML来配置作业的机制,而Obsidian则为你提供了一套完整的管理和监控的WEB应用. 然而,有一些使用场景还是强烈推荐使用API的,我们来看一下吧.

MapReduce调度与执行原理之任务调度

- - CSDN博客云计算推荐文章
前言:本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教. 本文不涉及Hadoop的架构设计,如有兴趣请参考相关书籍和文献. 在梳理过程中,我对一些感兴趣的源码也会逐行研究学习,以期强化基础. 作者:Jaytalent.

Java Spring注解任务调度并实现AOP监控任务执行情况

- - 极客521 | 极客521
本文讲的是通过Spring注解的方式实现任务调度. 只要引入了spring-context包就能够在项目中使用注解方式的任务调度. 需要在Spring配置文件中加入task的schema. 然后在代码中就可以直接用了,要定时执行的方法必须是void的,并且没有任何参数的. cron表达式请自行问百度,下面只列出几个从网上找的例子.

几种任务调度的 Java 实现方法与比较

- wangyegang - IBM developerWorks 中国 : 文档库
综观目前的 Web 应用,多数应用都具备任务调度的功能. 本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有价值的参考.

Spring实现后台的任务调度TimerTask和Quartz

- - CSDN博客互联网推荐文章
最近整后台,涉及到两个后台调度的问题. 一是以时间间隔为条件的轮询调度;. 运用场景:每隔5分钟抓取数据;. 二是一某个时间点为条件的轮询调度;. 运用场景:后台日志货报表生成上传,每个周一生成上一周的,每个月初生成上一月. 其实按周来执行调度,用前面一个场景也可以实现,但是按月生成,因为每月时间不固定,必须动态判断和执行.

Spring 任务调度Quartz的cron表达式

- - ITeye博客
Spring支持基于Quartz的任务调度,那么其cron表达式类似于Linux的crontab,有7个字符构成,详情如下:. 表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五. 表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即等同于10,11,12.

Java定时任务调度:用ExecutorService取代Timer

- - ITeye博客
《Java并发编程》一书提到,用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:. 如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为. Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程. 这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了.

Spark 性能相关参数配置详解-任务调度篇

- - ITeye博客
随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化. 由于篇幅较长,所以在这里分篇组织,如果要看最新完整的网页版内容,可以戳这里: http://spark-config.readthedocs.org/,主要是便于更新内容.