当前位置: 移动技术网 > IT编程>开发语言>.net > 浅谈Quartz定时任务调度

浅谈Quartz定时任务调度

2018年11月29日  | 移动技术网IT编程  | 我要评论

遵义联盟,仇思隽,张慕妮

一  开发概述

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

 对于大部分企业来说,实现如上功能,挑战在哪里?

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

      是从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比较关键的两个核心组件分别为job和trigger

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

 

(二)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:

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命名空间

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)

 

三  代码

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

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

1.首先使用nuget下载quartz

本示例使用的quartz版本为1.0.3

2.按照如下步骤操作

代码:

第一阶段:创建实现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.测试结果

 

四  参考文献

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

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

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

五  版权区

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网