欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈Quartz定时任务调度

程序员文章站 2022-03-12 14:55:49
一 开发概述 对于具有一定规模的大多数企业来说,存在着这样一种需求:存在某个或某些任务,需要系统定期,自动地执行,然而,对大多数企业来说,该技术的实现,却是他们面临的一大难点和挑战。 对于大部分企业来说,实现如上功能,挑战在哪里? 挑战一:如何做一个自动服务的系统? 是从0到1开发(费时费力花钱,还 ......

一  开发概述

       对于具有一定规模的大多数企业来说,存在着这样一种需求:存在某个或某些任务,需要系统定期,自动地执行,然而,对大多数企业来说,该技术的实现,却是他们面临的一大难点和挑战。

浅谈Quartz定时任务调度 对于大部分企业来说,实现如上功能,挑战在哪里?

挑战一:如何做一个自动服务的系统?

      是从0到1开发(费时费力花钱,还不一定开发成功,即使开发成功,也未必好用),还是购买第三方服务(花钱)。

挑战二:如何实现复杂的“定期规则”?

     对于简单的定期规则,可以借助于windows自带的执行计划来执行,但若是复杂的定期规则,windows执行计划未必可行,然而,quartz的cron却很好地解决了该问题,

(可以说,cron在表达时间规则方面,无所不能),除此之外,quartz能很好地配合windows执行计划,实现系统的定期,自动执行任务。

      通过如上概述,我们知道quartz能很好地解决该问题,那么,什么是quartz呢?

      简言之,quartz就是一种任务调度计划。

  • 它是由opensymphony提供的、开源的、java编写的强大任务调度框架
  • 几乎可以集成到任何规模的运用程序中,如简单的控制台程序,复杂的大规模分布式电子商务系统
  • 可用于创建简单的或复杂的计划任务
  • 包含很多企业级功能,如支持jta和集群等

      本篇文章,主要从quartz框架核心组件,quartz基本运行原理,quartz核心概念和quartz基本功能实现(代码)等方面来介绍quartz。

二  quartz

当要深入研究一个技术时,研究它的体系结构和内部运行原理,不失为一种较好的方式。同理,我们在研究quartz时,也采用类似的方法,

下图为quartz的大致结构图。

浅谈Quartz定时任务调度

 

(一)quartz关键组件

quartz比较关键的两个核心组件分别为job和trigger

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

浅谈Quartz定时任务调度

 

(二)quartz几个关键概念

1.ijob

ijob表示一个接口,该接口只有一个方法签名

public interface ijob
    {
        void execute(jobexecutioncontext context);
    }

在quartz中,所有的job任务,必须实现该接口

public class myjob : ijob
    {
        public void execute(jobexecutioncontext context)
        {
            console.writeline("quartz基本功能测试。");
        }
    }

2.jobdetail

 jobdetail,顾名思义,就是表示关于每个job的相关信息,它主要包括两个核心组件,即job task和jobdata map

3.trigger

trigger,表示触发器,根据配置规则来触发执行计划调度job,它主要包括两个核心组件,即simpletrigger和crontrigger

4.ijobstore

ijobstore,表述任务存储器,主要存储job和trigger相关信息。

5.ischedulerfactory

ischedulerfactory,表示任务计划工厂,用来管理任务计划ischeduler。

6.ischeduler

ischeduler,表述任务计划,它相当于一个容器,具体job和job相关trigger就能够被注入其中,从而实现任务计划调度。其主要常用的方法:

  • start --启动执行计划
  • shutdowm --关闭执行计划

接口code:

浅谈Quartz定时任务调度
namespace quartz
{
    public interface ischeduler
    {
        bool isstarted { get; }
        string schedulername { get; }
        string schedulerinstanceid { get; }
        bool instandbymode { get; }
        bool isshutdown { get; }
        ijobfactory jobfactory { set; }
        string[] jobgroupnames { get; }
        string[] triggergroupnames { get; }
        schedulercontext context { get; }
        ilist globaljoblisteners { get; }
        string[] calendarnames { get; }
        ilist globaltriggerlisteners { get; }
        iset triggerlistenernames { get; }
        iset joblistenernames { get; }
        ilist schedulerlisteners { get; }

        void addcalendar(string calname, icalendar calendar, bool replace, bool updatetriggers);
        void addglobaljoblistener(ijoblistener joblistener);
        void addglobaltriggerlistener(itriggerlistener triggerlistener);
        void addjob(jobdetail jobdetail, bool replace);
        void addjoblistener(ijoblistener joblistener);
        void addschedulerlistener(ischedulerlistener schedulerlistener);
        void addtriggerlistener(itriggerlistener triggerlistener);
        bool deletecalendar(string calname);
        bool deletejob(string jobname, string groupname);
        icalendar getcalendar(string calname);
        string[] getcalendarnames();
        ilist getcurrentlyexecutingjobs();
        ijoblistener getglobaljoblistener(string name);
        itriggerlistener getglobaltriggerlistener(string name);
        jobdetail getjobdetail(string jobname, string jobgroup);
        ijoblistener getjoblistener(string name);
        string[] getjobnames(string groupname);
        schedulermetadata getmetadata();
        iset getpausedtriggergroups();
        trigger gettrigger(string triggername, string triggergroup);
        itriggerlistener gettriggerlistener(string name);
        string[] gettriggernames(string groupname);
        trigger[] gettriggersofjob(string jobname, string groupname);
        triggerstate gettriggerstate(string triggername, string triggergroup);
        bool interrupt(string jobname, string groupname);
        bool isjobgrouppaused(string groupname);
        bool istriggergrouppaused(string groupname);
        void pauseall();
        void pausejob(string jobname, string groupname);
        void pausejobgroup(string groupname);
        void pausetrigger(string triggername, string groupname);
        void pausetriggergroup(string groupname);
        bool removeglobaljoblistener(ijoblistener joblistener);
        bool removeglobaljoblistener(string name);
        bool removeglobaltriggerlistener(itriggerlistener triggerlistener);
        bool removeglobaltriggerlistener(string name);
        bool removejoblistener(string name);
        bool removeschedulerlistener(ischedulerlistener schedulerlistener);
        bool removetriggerlistener(string name);
        datetime? reschedulejob(string triggername, string groupname, trigger newtrigger);
        void resumeall();
        void resumejob(string jobname, string groupname);
        void resumejobgroup(string groupname);
        void resumetrigger(string triggername, string groupname);
        void resumetriggergroup(string groupname);
        datetime schedulejob(trigger trigger);
        datetime schedulejob(jobdetail jobdetail, trigger trigger);
        void shutdown(bool waitforjobstocomplete);
        void shutdown();
        void standby();
        void start();
        void startdelayed(timespan delay);
        void triggerjob(string jobname, string groupname);
        void triggerjob(string jobname, string groupname, jobdatamap data);
        void triggerjobwithvolatiletrigger(string jobname, string groupname);
        void triggerjobwithvolatiletrigger(string jobname, string groupname, jobdatamap data);
        bool unschedulejob(string triggername, string groupname);
    }
}
view code

 (三)核心uml图

1.命名空间

不同版本的quartz命名空间有所区别,但差别不大,如下为版本1.0.3命名空间

浅谈Quartz定时任务调度

using quartz;
using quartz.core;
using quartz.impl;
using quartz.impl.adojobstore;
using quartz.impl.adojobstore.common;
using quartz.impl.calendar;
using quartz.impl.matchers;
using quartz.impl.triggers;
using quartz.listener;
using quartz.logging;
using quartz.logging.logproviders;
using quartz.simpl;
using quartz.spi;
using quartz.util;
using quartz.xml;
using quartz.xml.jobschedulingdata20;
using system;

2.关键组件继承关系

    在quartz中,许多组件是可以通过配置来促使作业执行的,如线程程序(tread procedure)决定如何执行计划任务线程(quartz scheduler thread)

 浅谈Quartz定时任务调度

三  代码

本示例,我们将使用.net 控制台程序,基于vs2017来使用quartz建立一个任务:

任务要求:要求在控制台每隔2秒输出:quartz基本功能测试。

1.首先使用nuget下载quartz

本示例使用的quartz版本为1.0.3

2.按照如下步骤操作

浅谈Quartz定时任务调度

代码:

第一阶段:创建实现ijob接口的myjob类

    public class myjob : ijob
    {
        public void execute(jobexecutioncontext context)
        {
            console.writeline("quartz基本功能测试。");
        }
    }

第二阶段:按规则调用quartz组件

static void main(string[] args)
        {
            //每个2秒执行一次
            string cronparam = "*/2 * * * * ?";
            //创建计划任务抽象工厂
            ischedulerfactory sf = new stdschedulerfactory();
            //创建计划任务
            ischeduler sched = sf.getscheduler();
            //创建job
            jobdetail job = new jobdetail("myjob","group", typeof(myjob));
            //创建触发器
            trigger trigger = new crontrigger("mytrigger","group",cronparam);
            //将job和trigger注入到计划任务中
            sched.schedulejob(job, trigger);
            //启动计划任务
            sched.start();
            //关闭计划任务
            //sched.shutdown();

            console.read();
        }

3.测试结果

浅谈Quartz定时任务调度

 

四  参考文献

【01】http://www.quartz-scheduler.org/

【02】https://www.ibm.com/developerworks/library/j-quartz/index.html

【03】https://www.w3cschool.cn/quartz_doc/

五  版权区

  • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2098469527@qq.com。
  • 可以转载该博客,但必须著名博客来源。