精华内容
下载资源
问答
  • J2EE企业级定时调度

    2016-05-16 13:36:19
    企业级定时调度常用的有3种: JDK自带的并发框架 ...调度方式: JDK自带的并发框架 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( ); scheduler.scheduleAtFixedRat

    企业级定时调度常用的有3种:

    • JDK自带的并发框架

    • 开源的Quartz调度框架

    • 基于前面两种进行封装的SPRING定时调度框架

    调度方式:

    1. JDK自带的并发框架
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                }
        }, 10, 2, TimeUnit.MILLISECONDS);
    1. 开源的Quartz调度框架:

      scheduler.scheduleJob(jobDetail, trigger);
    2. SPRING定时调度框架:
      SPRING对前面两种进行了简化封装,尤其是第一种;

    对JDK并发框架的封装,对源码感兴趣的可以查看ScheduledAnnotationBeanPostProcessor和ScheduledTaskRegistrar的源码

    配置举例:

    <task:scheduled-tasks>  
            <task:scheduled ref="logImpTask" method="impActionLogToDb"  
                fixed-delay="5000" />  
        </task:scheduled-tasks> 

    ref含义:spring容器的beanId

    method含义:调用的方法

    fixed-delay:每隔多少时间调用(单位秒)

    cron :cron表达式

    对QUARTZ的封装,对源码感兴趣的可以查看SchedulerFactoryBean源码;
    通过@Autowired Scheduler scheduler;引用Scheduler后,调用quartz的相关方法,可以根据实际需要动态的增删调度。

    除此之外还有分布调度,充分利用多节点优势进行任务计算,如:当当网的elasticjob

    展开全文
  • 常用ETL任务调度框架组件

    千次阅读 2018-06-05 20:17:00
    1. Cron-like Scheduler1.1 Python任务调度框架 APScheduler一个基于Python,提供类似Cron功能,并深受Java Quartz 影响的轻量级进程内任务调度框架。Advanced Python Scheduler (APScheduler) is a light but ...

    1. Cron-like Scheduler

    1.1 Python任务调度框架 APScheduler

    一个基于Python,提供类似Cron功能,并深受Java Quartz 影响的轻量级进程内任务调度框架。

    Advanced Python Scheduler (APScheduler) is a light but powerful in-process task scheduler that lets you schedule jobs (functions or any python callables) to be executed at times of your choosing.

    This can be a far better alternative to externally run cron scripts for long-running applications (e.g. web applications), as it is platform neutral and can directly access your application's variables and functions.

    The development of APScheduler was heavily influenced by theQuartz task scheduler written in Java. APScheduler provides most of the major features that Quartz does, but it also provides features not present in Quartz (such as multiple job stores).

    https://pypi.python.org/pypi/APScheduler/


    1.2 任务调度框架 cron4j

    cron4j 是一个Java的任务调度框架,类似于UNIX系统下的crontab.

    使用示例:

    import it.sauronsoftware.cron4j.Scheduler;
    
    public class TestScheduler {
    	public static void main(String[] args) throws Throwable {
    		Scheduler scheduler = new Scheduler();
    		scheduler.schedule("* * * * *", new HelloWorldTask());
    		scheduler.start();
    		Thread.sleep(300000); // pause the main thread for 5 minutes
    		scheduler.stop();
    	}
    }

    http://www.sauronsoftware.it/projects/cron4j/manual.php


    1.3 conclusion:

    (1). not web-based application

    (2). need to program

    (3). just only scheduler


    2. Gearman分布式远程过程处理框架

    2.1Outline

    Gearmand 是 Gearman 的作业服务器组件,Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能。它的 任务分布非常 简单,简单得可以只需要用脚本即可完成。Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资 源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。

    作业调度服务器 Gearmand


    2.2 Features

    Open Source - It's free! (in both meanings of the word) Gearman has an active open source community that is easy to get involved with if you need help or want to contribute.

    Multi-language - There are interfaces for a number of languages, and this list is growing. You also have the option to write heterogeneous applications with clients submitting work in one language and workers performing that work in another.

    Flexible - You are not tied to any specific design pattern. You can quickly put together distributed applications using any model you choose, one of those options being Map/Reduce.

    Fast Gearman has a simple protocol and interface with a new optimized server in C to minimize your application overhead.

    Embeddable - Since Gearman is fast and lightweight, it is great for applications of all sizes. It is also easy to introduce into existing applications with minimal overhead.

    No single point of failure Gearman can not only help scale systems, but can do it in a fault tolerant way.

     http://gearman.org/


    3 ETL open-source Scheduler: TASKCTL

    TASKCTL开源版作为目前唯一的ETL调度领域开源软件,保证100% free,绝无黑盒代码。它志在促进该领域的独立发展,使调度在ETL领域独立化、专业化、系统化。从而使项目实施更轻松便捷,使企业基础架构更清晰、更易管理。

    (一)主要适用环境

        操作系统:aix/linux/unix等(由于采用标准c语言构建,理论上可应用与各种主流unix系列)

        项目规模:适用于中小型ETL项目

        ETL工具环境:TASKCTL由于采用任务插件驱动机制,因此,可支持各种存储过程、各种脚本、以及诸如Datastage\Informatica\kettle等各种ETL工具任务。

     

    (二)主要功能

        核心调度功能:主要可以完成串行、并行、依赖、互斥、执行计划、定时、容错、循环、条件分支、远程、负载均衡、自定义条件等各种不同的核心调度功能。

        扩展功能

            网络扩展:可实现单机部署、多服务部署、远程代理部署、集群部署等多种网络部署

            应用扩展:技术平台设计有专门的应用API接口,可实现更多的调度应用。

            任务类型扩展:为了适应不同类型的任务调度,平台可通过具有统一模版、统一接口的插件进行快速扩展。

        应用功能:配置功能、流程设计功能、监控功能、各种查询功能以及诸如重跑、重置等人工干预功能。

     

    (三) 主要创新

        无数据库设计:国内首款专业无数据库调度技术平台。

        插件机制:业界唯一通过具有统一应用接口的插件来扩展任务类型的技术平台。

        流程设计代码开发设计理念:调度领域唯一通过文本代码设计流程的调度技术平台。具有语法代码特征的文本代码设计与传统记录表格对话框方式相比,操作更方便、设计更灵活、可读性更强。



    http://www.taskctl.com/

    展开全文
  • 大数据定时任务调度常用工具

    千次阅读 2020-04-15 17:38:14
    特点: 分布式任务调度:允许一个工作流的task在多台worker上同时执行 可构建任务依赖:以有向无环图的方式构建任务依赖关系 task原子性:工作流上每个task都是原子可重试的,一个工作流某个环节的task失败可自动或...

    一、Crontab

    1.概述

    crontab是一个命令,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。用户所建立的crontab文件中,每一行代表一项任务,每行的每个字段代表一项设置,共分六个字段,前五段是时间设定段,第六段是要执行的命令段
    在这里插入图片描述

    # For details see man 4 crontabs
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # | .------------- hour (0 - 23)
    # | | .---------- day of month (1 - 31)
    # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
    # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # | | | | |
    # * * * * * user-name command to be executed
    定时任务的每段为:分,时,日,月,周,用户,命令
    第1列表示分钟1~59 每分钟用*或者 */1表示
    第2列表示小时1~23(0表示0点)
    第3列表示日期1~31
    第4列表示月份1~12
    第5列标识号星期0~6(0表示星期天)
    第6列要运行的命令
    
    *:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59分
    -:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令
    ,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令
    /n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分钟执行一次
    
    2.实现定时的三种方式

    数据准备:

    #!/bin/bash
    # /data/test/test01.sh
    
    echo $(date "+%H:%M:%S") >> /data/test/test.txt
    

    (1)第一种:在/etc/crontab下设置,指定用户名的 (不专业写法,一般不写在这里面)

    //进入设置界面
    # vim /etc/crontab
    
    //在最后一行加上
    //说明:代表14:00-16:59点之间每2分钟执行一次命令
     */2 14-16 *  *  * root  /data/test/test01.sh
    
    
    //重启crontab,使配置生效
    # /bin/systemctl restart crond.service
    

    在这里插入图片描述

    (2)第二种:直接用crontab -e,不需要指定用户,如果是root权限,默认是root定时的

    //crontab -e进入编辑
    # crontab -e
    
    //编写脚本,17:21执行一次test01脚本
     21 17 *  *  *  root  /data/test/test01.sh
     
    //查看文件和重定向文件权限,如果没有执行权限,修改
    #chmod 777 /data/test/test01.sh
    # chmod 777 /data/test/
    
    
    //重启crontab,使配置生效
    # /bin/systemctl restart  crond.service
    
    

    (3)第三种:直接写入/var/spool/cron/root(是用户名称)

    crontab文件的一些例子:
    1)30 21 * * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每晚的21:30重启apache。
    
    2)45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每月1、10、22日的4 : 45重启apache。
    
    3)10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每周六、周日的1 : 10重启apache。
    
    4)0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。最后一次的任务执行时间为23:30
    
    5)0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每星期六的11 : 00 pm重启apache。
    
    6)* */1 * * * /usr/local/etc/rc.d/lighttpd restart
    每一小时重启apache(错误的)
    *代表每分钟就执行一次,上面的语句的意思为每隔一小时的每分钟都在执行重启apache
    
    */60 * * * * #每60分钟即每小时执行一次
    */105 * * * * #每105分钟执行一次
    
    7)* 23,00-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
    晚上11点到早上7点之间,每隔一小时重启apache(错误的)
    
    上面的定时任务的分钟为*号,代表每分钟都在执行,
    表示晚上23点和凌晨0-7点之间每隔一小时的每分钟都在再行重启apache
    
    8)0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
    每月的4号与每周一到周三的11点重启apache(周和日尽量不要同时使用)
    
    9)0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
    一月一号的4点重启apache
    
    3.crontab命令选项
    crontab命令选项:
    
    -u指定一个用户
    -l列出某个用户的任务计划
    -r删除某个用户的任务
    -e编辑某个用户的任务
    
    4.任务执行不成功原因

    1.查看定时任务有没有开启
    2.符号*号是否弄懂,是否写错,代表每一分钟,小时,日,月,周
    3.执行权限等等
    4.执行的脚本或者写入文件的目录是否存在,是否是绝对路径
    5.是否有系统变量,定时任务对系统变量的识别很少,比如写个tomcat定时关机,手工ok,但是脚本就是不执行
    6.命令放定时任务里面,时间的%必需要转义%
    7.多看定时任务日志
    8.crond不能守护秒级定时任务,通常秒级的定时任务需要自己写shell脚本

    二、Azkaban

    Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
    它有如下功能特点:

    兼容任何版本的hadoop;
    易于使用的web界面;
    简单工作流的上传;
    方便配置任务之间的依赖关系;
    调度工作流;
    模块化和可插拔的插件机制;
    认证/授权;
    能够杀死并重新启动工作流;
    失败和成功的电子邮件提醒;

    部署方式和使用参考博文:Azkaban安装部署(实战优化)

    三、Oozie

    Oozie:训象人(调度mapreduce)。一个基于工作流引擎的开源框架,Oozie需要部署到java servlet中运行,主要用于定时调度,多任务之间按照执行的逻辑顺序调度。

    Oozie 下载地址:https://oozie.apache.org

    它有如下功能特点:

    统一调度hadoop系统常见的mr任务启动,hdfs操作,shell调度,hive操作等;
    让复杂的依赖关系,时间触发,事件触发使用xml语言进行表达,开发效率增高(这个不一定,个人很讨厌xml,我觉得效率不高…);
    一组任务使用一个DAG表示,使用图形表达,流程清晰; 支持多种任务调度,能完成大部分的hadoop任务;
    程序定义支持EL常量和函数,表达丰富; Oozie规定在完成工作后发送电子邮件通知;
    Azkaban使用Web操作。Oozie支持Web,RestApi,Java API操作;

    四、AirFlow

    airflow是一款开源的,分布式任务调度框架,它将一个具有上下级依赖关系的工作流,组装成一个有向无环图。
    特点:
    分布式任务调度:允许一个工作流的task在多台worker上同时执行
    可构建任务依赖:以有向无环图的方式构建任务依赖关系
    task原子性:工作流上每个task都是原子可重试的,一个工作流某个环节的task失败可自动或手动进行重试,不必从头开始任务
    工作流示意图
    在这里插入图片描述
    一个dag表示一个定时的工作流,包含一个或者多个具有依赖关系的task
    task依赖图
    在这里插入图片描述
    详情参考
    使用方式:https://www.jianshu.com/p/cbff05e3f125

    五、数栖云

    Apache Oozie 是一个重量级的任务调度系统,功能全面,但是部署及配置会比较麻烦,从 crontab 到 Oozie 上手会有一定难度。Azkaban 是介于 oozie 和 Crontab 之间的工具,但是安全性上不如 Oozie,同时如果出现失败情况,Azkaban会丢失所有的工作流,Oozie则可以继续运行
    基于数澜科技旗下产品数栖4.0部署于云端,面向于个人、企业主和独立数据应用开发商提供的一个一站式大数据工具平台和社区。基础套餐永久免费!透过数栖平台,个人和企业无需过多关注大数据底层存储和计算引擎的复杂的安装、繁琐的配置和日常运维,即可将自有的多来源业务系统数据进行集成和开发,形成数据资产,并赋能于自有业务场景,在云端轻松构建自有数据中台。

    完成20多种数据源的适配调度:Mysql、Oracle、Hive、HBase、Redis、MongoDB、ODPS、Postgresql、ElasticSearch、API等;
    模块化和可插拔的插件机制;
    支持可视化工作流配置;
    支持任务告警:邮件,电话,短信;
    调度类型多样化:正常调度,空跑,暂停调度;
    支持任务优先级配置;
    调度周期配置简单:
    进行鼠标点击即可;
    支持工作流与工作流之间组装;
    支持工作流测试运行;
    在工作流查看界面中就可以完成:
    查看代码,运行日志,重跑,置成功并重跑下游,重跑下游等操作;
    出错任务快速定位;
    在这里插入图片描述

    六、Quartz

    对于简单的定期规则,可以借助于windows自带的执行计划来执行,但若是复杂的定期规则,windows执行计划未必可行,然而,Quartz的cron却很好地解决了该问题,
    (可以说,cron在表达时间规则方面,无所不能),除此之外,Quartz能很好地配合windows执行计划,实现系统的定期,自动执行任务。
    1.Quartz关键组件

    Quartz比较关键的两个核心组件分别为Job和Trigger

    job–表示任务是什么
    trigger–表示何时触发任务

    七、分布式XXL-JOB

    XXL开源社区】已经发布一系列开源软件产品,涉及分布式、基础中间件、效率工具等多个领域。
    包含项目有:任务调度、配置中心、通讯框架(+注册中心)、消息队列、SSO、API管理、爬虫……等等
    XXL开源社区:https://www.xuxueli.com/page/projects.html
    搭建教程:

    八、其它

    1.nivicat(触发器)
    2.window本地
    展开全文
  • 基于 Quartz 开发企业级任务调度应用

    千次阅读 2016-08-01 17:45:03
    Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。作为一个优秀的开源调度框架,Quartz 具有功能强大,应用灵活,易于集成的特点。本文剖析了 Quartz 框架内部的基本实现原理,...

    源自:http://www.oschina.net/question/129540_111323

    简介

    Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。作为一个优秀的开源调度框架,Quartz 具有功能强大,应用灵活,易于集成的特点。本文剖析了 Quartz 框架内部的基本实现原理,通过一些具体实例描述了应用 Quartz 开发应用程序的基本方法,并对企业应用中常见的问题及解决方案进行了讨论。

    Quartz 基本概念及原理

    Quartz Scheduler 开源框架

    Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。读者可以到http://www.quartz-scheduler.org/站点下载 Quartz 的发布版本及其源代码。笔者在产品开发中使用的是版本 1.8.4,因此本文内容基于该版本。本文不仅介绍如何应用 Quartz 进行开发,也对其内部实现原理作一定讲解。

    作为一个优秀的开源调度框架,Quartz 具有以下特点:


    1. 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
    2. 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
    3. 分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。本文暂不讨论该部分内容
    另外,作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。

    下面是本文中用到的一些专用词汇,在此声明:

    scheduler:任务调度器

    trigger:触发器,用于定义任务调度时间规则

    job:任务,即被调度的任务

    misfire:错过的,指本来应该被执行但实际没有被执行的任务调度

    Quartz 任务调度的基本实现原理

    核心元素  

    Quartz 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任务调度的元数据, scheduler 是实际执行调度的控制器。

    在 Quartz 中,trigger 是用于定义调度时间的元素,即按照什么时间规则去执行任务。Quartz 中主要提供了四种类型的 trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和 NthIncludedDayTrigger。这四种 trigger 可以满足企业应用中的绝大部分需求。

    在 Quartz 中,job 用于表示被调度的任务。主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。Job 主要有两种属性:volatility 和 durability,其中 volatility 表示任务是否被持久化到数据库存储,而 durability 表示在没有 trigger 关联的时候任务是否被保留。两者都是在值为 true 的时候任务被持久化或保留。一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job。

    在 Quartz 中,scheduler 是实际执行调度的控制器, 由 scheduler 工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。第二种工厂 StdSchedulerFactory 使用较多,因为DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。 Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。本文以最常用的 StdScheduler 为例讲解。这也是笔者在项目中所使用的 scheduler 类。

    Quartz 核心元素之间的关系如下图所示:

    图 1. Quartz 核心元素关系图

    线程视图

    在 Quartz 中,有两类线程,Scheduler 调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。


    图 2. Quartz 线程视图

    Scheduler 调度线程主要有两个: 执行常规调度的线程,和执行 misfired trigger 的线程。常规调度线程轮询存储的所有 trigger,如果有需要触发的 trigger,即到达了下一次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该 trigger 关联的任务。Misfire 线程是扫描所有的 trigger,查看是否有 misfired trigger,如果有的话根据 misfire 的策略分别处理。下图描述了这两个线程的基本流程:

    图 3. Quartz 调度线程流程图

    数据存储

    Quartz 中的 trigger 和 job 需要存储下来才能被使用。Quartz 中有两种存储方式:RAMJobStore, JobStoreSupport,其中 RAMJobStore 是将 trigger 和 job 存储在内存中,而 JobStoreSupport 是基于 jdbc 将 trigger 和 job 存储到数据库中。RAMJobStore 的存取速度非常快,但是由于其在系统被停止后所有的数据都会丢失,所以在通常应用中,都是使用 JobStoreSupport。
    在 Quartz 中,JobStoreSupport 使用一个驱动代理来操作 trigger 和 job 的数据存储:StdJDBCDelegate。StdJDBCDelegate 实现了大部分基于标准 JDBC 的功能接口,但是对于各种数据库来说,需要根据其具体实现的特点做某些特殊处理,因此各种数据库需要扩展 StdJDBCDelegate 以实现这些特殊处理。Quartz 已经自带了一些数据库的扩展实现,可以直接使用,如下图所示:

    图 4. Quartz 数据库驱动代理

    作为嵌入式数据库的代表,Derby 近来非常流行。如果使用 Derby 数据库,可以使用上图中的 CloudscapeDelegate 作为 trigger 和 job 数据存储的代理类。

    基本开发流程及简单实例

    搭建开发环境

    利用 Quartz 进行开发相当简单,只需要将下载开发包中的 quartz-all-1.8.4.jar 加入到 classpath 即可。根据笔者的经验,对于任务调度功能比较复杂的企业级应用来说,最好在开发阶段将 Quartz 的源代码导入到开发环境中来。一方面可以通过阅读源码了解 Quartz 的实现机理,另一方面可以通过扩展或修改 Quartz 的一些类来实现某些 Quartz 尚不提供的功能。

    图 5. Quartz 实例工程及源码导入


    上图中左边是源码导入后的截图,其中 org.quartz.* 即为 quartz 的源码。导入源码后可能会有一些编译错误,通常出现在 org.quartz.ee.* 和 org.quartz.jobs.ee.* 包中。下载开发包中有一个 lib 目录,读者可以将该目录下的 jar 文件加入到编译环境。如果还有编译错误,读者可以参考上图中右侧的 jar 列表,到网上去搜索下载。

    项目中 com.ibm.zxn.sample.quartz 是我们自己的类包,下面的实例中我们会用到它。

    一个简单实例

    Quartz 开发包中有一个 examples 目录,其中有 15 个基本实例。建议读者阅读并实践这些例子。本文这里只列举一个小的实例,介绍基本的开发方法。

    1、准备数据库和 Quartz 用的数据表

    1.1、本文使用 IBM DB2 数据库:将 jdbc 驱动程序 db2jcc.jar 加入到项目中;
    1.2、在数据库中创建一个新库 QUARTZDB;
    1.3、执行 /quartz-1.8.4/docs/dbTables/tables_db2_v8.sql,创建数据表;表建好后如下所示:

    图 6. Quartz 数据表

    2、准备配置文件,加入到项目中

    图 7. 实例配置文件

    3、通过实现 job 接口定义我们自己的任务类,如下所示:

    图 8. 定义任务类

    4、然后,实现任务调度的主程序,如下所示:本实例中,我们利用 DateIntervalTrigger 实现一个每两分钟执行一次的任务调度。

    图 9. 实现主程序


    5、完成后项目结构如下所示:

    图 10. 实例项目结构图

    6、运行程序,查看数据库表和运行结果

    图 11. QRTZ_TRIGGERS 表中的记录

    图 12. QRTZ_JOB_DETAILES 表中的记录

    从运行结果来看,任务每两分钟被执行一次:

    图 13. 运行结果

    企业级开发中的常见应用

    在应用 Quartz 进行企业级的开发时,有一些问题会经常遇到。本节笔者根据自己在项目开发中的经验,介绍企业开发中常见的一些问题以及通常的解决办法。

    应用一:如何使用不同类型的 Trigger

    前面我们提到 Quartz 中四种类型的 Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger, 和 NthIncludedDayTrigger。

    SimpleTrigger 一般用于实现每隔一定时间执行任务,以及重复多少次,如每 2 小时执行一次,重复执行 5 次。SimpleTrigger 内部实现机制是通过计算间隔时间来计算下次的执行时间,这就导致其不适合调度定时的任务。例如我们想每天的 1:00AM 执行任务,如果使用 SimpleTrigger 的话间隔时间就是一天。注意这里就会有一个问题,即当有 misfired 的任务并且恢复执行时,该执行时间是随机的(取决于何时执行 misfired 的任务,例如某天的 3:00PM)。这会导致之后每天的执行时间都会变成 3:00PM,而不是我们原来期望的 1:00AM。

    CronTirgger 类似于 LINUX 上的任务调度命令 crontab,即利用一个包含 7 个字段的表达式来表示时间调度方式。例如,"0 15 10 * * ? *" 表示每天的 10:15AM 执行任务。对于涉及到星期和月份的调度,CronTirgger 是最适合的,甚至某些情况下是唯一选择。例如,"0 10 14 ? 3 WED" 表示三月份的每个星期三的下午 14:10PM 执行任务。读者可以在具体用到该 trigger 时再详细了解每个字段的含义。

    DateIntervalTrigger 是 Quartz 1.7 之后的版本加入的,其最适合调度类似每 N(1, 2, 3...)小时,每 N 天,每 N 周等的任务。虽然 SimpleTrigger 也能实现类似的任务,但是 DateIntervalTrigger 不会受到我们上面说到的 misfired 任务的影响。另外,DateIntervalTrigger 也不会受到 DST(Daylight Saving Time, 即中国的夏令时)调整的影响。笔者就曾经因为该原因将项目中的 SimpleTrigger 改为了 DateIntervalTrigger,因为如果使用 SimpleTrigger,本来设定的调度时间就会由于 DST 的调整而提前或延迟一个小时,而 DateIntervalTrigger 不会受此影响。

    NthIncludedDayTrigger 的用途比较简单明确,即用于每隔一个周期的第几天调度任务,例如,每个月的第 3 天执行指定的任务。

    除了上面提到的 4 种 Trigger,Quartz 中还定义了一个 Calendar 类(注意,是 org.quartz.Calendar)。这个 Calendar 与 Trigger 一起使用,但是它们的作用相反,它是用于排除任务不被执行的情况。例如,按照 Trigger 的规则在 10 月 1 号需要执行任务,但是 Calendar 指定了 10 月 1 号是节日(国庆),所以任务在这一天将不会被执行。通常来说,Calendar 用于排除节假日的任务调度,从而使任务只在工作日执行。

    应用二:使用有状态(StatefulJob)还是无状态的任务(Job)

    在 Quartz 中,Job 是一个接口,企业应用需要实现这个接口以定义自己的任务。基本来说,任务分为有状态和无状态两种。实现 Job 接口的任务缺省为无状态的。Quartz 中还有另外一个接口 StatefulJob。实现 StatefulJob 接口的任务为有状态的,上一节的简单实例中,我们定义的 SampleJob 就是实现了 StatefulJob 接口的有状态任务。下图列出了 Quartz 中 Job 接口的定义以及一些自带的实现类:

    图 14. Quartz 中 Job 接口定义

    无状态任务一般指可以并发的任务,即任务之间是独立的,不会互相干扰。例如我们定义一个 trigger,每 2 分钟执行一次,但是某些情况下一个任务可能需要 3 分钟才能执行完,这样,在上一个任务还处在执行状态时,下一次触发时间已经到了。对于无状态任务,只要触发时间到了就会被执行,因为几个相同任务可以并发 执行。但是对有状态任务来说,是不能并发执行的,同一时间只能有一个任务在执行。

    在笔者项目中,某些任务需要对数据库中的数据进行增删改处理。这些任务不能并发执行,否则会造成数据混乱。因此我们使用 StatefulJob 接口。现在回到上面的例子,任务每 2 分钟执行一次,若某次任务执行了 5 分钟才完成,Quartz 会怎么处理呢?按照 trigger 的规则,第 2 分钟和第 4 分钟分别会有一次预定的触发执行,但是由于是有状态任务,因此实际不会被触发。在第 5 分钟第一次任务执行完毕时,Quartz 会把第 2 和第 4 分钟的两次触发作为 misfired job 进行处理。对于 misfired job,Quartz 会查看其 misfire 策略是如何设定的,如果是立刻执行,则会马上启动一次执行,如果是等待下次执行,则会忽略错过的任务,而等待下次(即第 6 分钟)触发执行。

    读者可以在自己的项目中体会两种任务的区别以及 Quartz 的处理方法,根据具体情况选择不同类型的任务。

    应用三:如何设置 Quartz 的线程池和并发任务

    Quartz 中自带了一个线程池的实现:SimpleThreadPool。类如其名,这只是线程池的一个简单实现,没有提供动态自发调整等高级特性。Quartz 提供了一个配置参数:org.quartz.threadPool.threadCount,可以在初始化时设定线程池的线程数量,但是一次设定后不能再 修改。假定这个数目是 10,则在并发任务达到 10 个以后,再有触发的任务就无法被执行了,只能等待有空闲线程的时候才能得到执行。因此有些 trigger 就可能被 misfire。但是必须指出一点,这个初始线程数并不是越大越好。当并发线程太多时,系统整体性能反而会下降,因为系统把很多时间花在了线程调度上。根 据一般经验,这个值在 10 -- 50 比较合适。

    对于一些注重性能的线程池来说,会根据实际线程使用情况进行动态调整,例如初始线程数,最大线程数,空闲线程数等。读者在应用中,如果有更好 的线程池,则可以在配置文件中通过下面参数替换 SimpleThreadPool:org.quartz.threadPool.class = myapp.GreatThreadPool。

    应用四:如何处理 Misfired 任务

    在 Quartz 应用中,misfired job 是经常遇到的情况。一般来说,下面这些原因可能造成 misfired job:

    1)系统因为某些原因被重启。在系统关闭到重新启动之间的一段时间里,可能有些任务会被 misfire;

    2)Trigger 被暂停(suspend)的一段时间里,有些任务可能会被 misfire;

    3)线程池中所有线程都被占用,导致任务无法被触发执行,造成 misfire;

    4)有状态任务在下次触发时间到达时,上次执行还没有结束;

    为了处理 misfired job,Quartz 中为 trigger 定义了处理策略,主要有下面两种:

    MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:针对 misfired job 马上执行一次;

    MISFIRE_INSTRUCTION_DO_NOTHING:忽略 misfired job,等待下次触发;

    建议读者在应用开发中,将该设置作为可配置选项,使得用户可以在使用过程中,针对已经添加的 tirgger 动态配置该选项。

    应用五:如何保留已经结束的 Trigger

    在 Quartz 中,一个 tirgger 在最后一次触发完成之后,会被自动删除。Quartz 默认不会保留已经结束的 trigger,如下面 Quartz 源代码所示:

    图 15. executionComplete( ) 源码

    但是在实际应用中,有些用户需要保留以前的 trigger,作为历史记录,或者作为以后创建其他 trigger 的依据。如何保留结束的 trigger 呢?

    一个办法是应用开发者自己维护一份数据备份记录,并且与 Quartz 原表的记录保持一定的同步。这个办法实际操作起来比较繁琐,而且容易出错,不推荐使用。

    另外一个办法是通过修改并重新编译 Quartz 的 trigger 类,修改其默认的行为。我们以 org.quartz.SimpleTrigger 为例,修改上面代码中 if (!mayFireAgain()) 部分的代码如下:

    图 16. 修改 executionComplete( ) 源码

    另外我们需要在 SimpleTrigger 中定义一个新的类属性:needRetain,如下所示:

    图 17. 定义新属性 needRetain

    在定义自己的 trigger 时,设置该属性,就可以选择是否在 trigger 结束时删除 trigger。如下代码所示:

    图 18. 使用修改后的 SimpleTrigger

    有人可能会考虑通过定义一个新的类,然后继承 org.quartz.SimpleTrigger 类并覆盖 executionComplete( ) 方法来实现。但是这种方法是行不通的,因为 Quartz 内部在处理时会根据 trigger 的类型重新生成 SimpleTrigger 类的实例,而不是使用我们自己定义的类创建的实例。这一点应该是 Quartz 的一个小小的不足之处,因为它把扩展 trigger 的能力堵死了。好在 Quartz 是开源的,我们可以根据需要进行修改。

    小结

    作为当前颇具生命力的开源框架,Quartz 已经得到了广泛的应用。Quartz 的强大功能和应用灵活性,在企业应用中发挥了巨大的作用。本文描述了如何应用 Quartz 开发应用程序,并对企业应用中常见的问题及解决方案进行了讨论。

    文章出处: IBM developerWorks






    展开全文
  • DR负载均衡群集部署)企业调度器LVS(Linux Virtual Server)集群和分布式1.1 集群 Cluster1.2 分布式系统1.3 集群和分布式1.4 集群设计原则1.5 集群设计实现1.5.1 基础设施层面1.5.2 业务层面1.6 LB Cluster 负载...
  • 开源 调度工具 azkaban 调度工具 处理有依赖关系的复杂任务调度,只支持mysql存储基本信息 常用调度工具之一 开源 crontab linux自带调度工具 简单任务调度 适用日常少量调度 开源 ooize 调度工具 处理复杂任务调度...
  • 调度

    千次阅读 2017-07-04 17:49:36
    简介: Quartz 是 OpenSymphony ...本文剖析了 Quartz 框架内部的基本实现原理,通过一些具体实例描述了应用 Quartz 开发应用程序的基本方法,并对企业应用中常见的问题及解决方案进行了讨论。 Quartz 基本概念及原理
  • Quartz:任务调度实现原理

    千次阅读 2018-12-03 08:29:45
    Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。 Quartz允许开发人员根据时间间隔来调度作业。 它实现了作业和触发器的多对多的关系,还能把多个作业与...
  • 任务调度器只管调用 execute() 方法,而不关心执行的结果,除了在作业执行中出问题抛出的 org.quartz.JobExecutionException 异常。它只负责作业的启动执行,而并不负责对执行任务的检核工作,如果出现运行异常,则...
  • 数据平台作业调度系统详解-实践篇

    万次阅读 热门讨论 2017-07-25 09:34:19
    上一篇文章,讨论了作业调度系统的分类,流派,架构实现方案和各种方案的优缺点以及适用场景,最后还简单总结了理想中,一个完备的工作流作业调度系统,应该具备哪些功能特性。但是,纸上得来终觉浅,绝知此事要躬行...
  • 初入Quartz任务调度

    千次阅读 2018-09-20 16:40:00
     在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作。  任务调度涉及多线程并发、线程池维护、运行时间规则解析、...
  • 集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能...
  • 定时任务的分布调度

    千次阅读 2017-10-09 11:47:23
    单机定式任务调度的问题 在很多应用系统中我们常常要定时执行一些任务。比如,订单系统的超时状态判断、缓存...常见的处理方式有线程的while(true) 和sleep组合、使用Timer定时器触发任务又或者是使用quartz框
  • 开源任务调度框架Quartz文档

    千次阅读 2011-04-20 17:25:00
    所以在任务调度的功能很常用,但是一个好的任务调度程序是一个颇具挑战性的工作。最近用到Quartz这个框架,感觉很好,所以进行学习。下面的是转载的一份入门的文档。 =====================================...
  • Quartz 任务调度全攻略

    千次阅读 2012-02-03 14:49:13
    Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行。 运行环境•Quartz 能嵌入在其他应用程序里运行。 •Quartz 能在一个应用服务器里被实例化(或servlet容器), 并且参与XA事务 •Quartz能独立运行...
  • 任务调度开源框架Quartz

    千次阅读 2014-07-31 13:58:17
    所以在任务调度的功能很常用,但是一个好的任务调度程序是一个颇具挑战性的工作。最近用到Quartz这个框架,感觉很好,所以进行学习。下面的是转载的一份入门的文档。   ========================================...
  • Java调度实现方案对比

    千次阅读 2017-04-18 10:37:59
    目前大多数企业都会用到定时调度功能,比如用来做日志归集、 定时做对账、文件处理解析等等。。。 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务,大家如果对我们的内容感兴趣的话,度娘...
  • 分布式任务调度的实现

    千次阅读 2018-04-12 11:45:13
    常见的处理方式有线程的while(true) 和sleep组合、使用Timer定时器触发任务又或者是使用quartz框架。貌似这些方法可以完美的解决方案,为什么还需要分布式呢?主要有如下两点原因:1.高可用:单机版的定式任务调度...
  • 进程调度概念及基本策略 引言:多进程并发是逻辑并发,在单个CPU上,实际上任意时刻只能有一个进程处于执行状态,而其它进程处于非执行状态。那么进程是如何调度的呢?本篇笔记将依次介绍进程调度概念、调度目标、...
  • Quartz的分布式任务调度应用

    万次阅读 2018-07-17 11:42:39
    目录 ...quartz企业级开发中的常见应用的一些问题及常见的解决方案 Quartz 基本概念及原理 Quartz Scheduler 开源框架 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全...
  • QOS队列调度机制简介

    千次阅读 2017-07-26 14:04:17
    1 简介队列调度机制在QoS技术体系中属于拥塞管理的范畴。虽然企业和运营商想尽一切办法去扩展自己的链路带宽,但是现实网络上各种应用对带宽的消耗速度远远超出企业和运营商带宽扩充能力,也就是说网络的拥塞是无法...
  • 任务调度 Quartz框架

    千次阅读 2011-01-16 17:21:00
    此外在构造Trigger时可以使用TriggerUtils工具类,它提供了很多常用的Trigger方法。   Quartz可以持久化任务调度信息,将这些信息保存到数据库中。   参考 spring企业应用开发详解 spring ...
  • Mac Book Pro常用快捷键

    万次阅读 2018-06-03 12:51:14
    Mac Book Pro常用快捷键 快捷键 描述 command + control + F 窗口最大化 command (+ option) + M (所有)窗口最小化 command (+ option) + W 关闭(所有)窗口 command + Q 退出应用 command...
  • Quartz 任务调度全攻略【转】

    千次阅读 2012-03-09 11:48:20
    Quartz是一个开源的任务调度系统 ,它能用来调度很多任务的执行。 运行环境•Quartz 能嵌入在其他应用程序里运行。 •Quartz 能在一个应用服务器里被实例化(或servlet容器), 并且参与XA事务 •Quartz能独立运行...
  • 公交企业一般来说承担着社会福利和企业化运作的双重负担,所以在全国范围内一般的公交企业都是亏损企业,而公交智能调度系统是在公交企业实用的,一般来说,在公交企业推行智能调度系统都是很困难的,其主要原因是,...
  • ETL作业调度软件TASKCTL产品功能清单

    千次阅读 2017-08-10 10:08:01
    作业依赖关系调度调度最基本的功能,指作业间具有顺序的运行,比如:a、b、c三个作业,只有当a完成后才运行b,b完成才能运行c 作业并行调度 与依赖关系对应,同样是调度的基本功能,指作业间运行不...
  • 大数据调度工具oozie详细介绍

    万次阅读 2018-08-17 22:55:53
    之前项目中的sqoop等离线数据迁移job都是利用shell脚本通过crontab进行定时执行,这样实现的话比较简单,但是随着多个job复杂度的提升,无论是协调工作还是任务监控都变...,我们选择使用oozie来对工作流进行调度监控...
  • 简介:阿里云容器服务团队结合多年 Kubernetes 产品与客户支持经验,对 Kube-scheduler 进行了大量优化和扩展,逐步使其在不同场景下依然能稳定、高效地调度各种类型的复杂工作负载。《进击的 Kubernetes 调度系统》...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,384
精华内容 15,753
关键字:

企业常用的调度方式