zoukankan      html  css  js  c++  java
  • Quartz.Net的使用(简单配置方法)定时任务框架

    Quartz.dll 安装nuget在线获取dll包管理器,从中获取最新版
    Quartz.Net是一个定时任务框架,可以实现异常灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。
    Quartz.Net中的概念:计划者(IScheduler)、工作(IJob)、触发器(Trigger)。给计划者一个工作,让他在Trigger(什么条件下做这件事)触发的条件下执行这个工作
    将要定时执行的任务的代码写到实现IJob接口的Execute方法中即可,时间到来的时候Execute方法会被调用。
    CrondTrigger是通过Crond表达式设置的触发器,还有 SimpleTrigger等简单的触发器。可以通过TriggerUtils的MakeDailyTrigger、MakeHourlyTrigger等方法简化调用。调用代码参考备注。
    初始化定时和结束定时的代码放到哪里(Application_Start,Application_End)

    1.先在bin文件夹中引用Quartz.Net的dll 文件

    Common.Logging.dll,Quartz.dll

    2.Global文件中的Application_Start。

    //从配置中读取任务启动时间
    int indexStartHour = Convert.ToInt32(ConfigurationManager.AppSettings["IndexStartHour"]);
    int indexStartMin = Convert.ToInt32(ConfigurationManager.AppSettings["IndexStartMin"]);


    ISchedulerFactory sf = new StdSchedulerFactory();//执行者
    sched = sf.GetScheduler();

    JobDetail job = new JobDetail("job1", "group1", typeof(TestJob));//TestJob为实现了IJob接口的类,(工作名称,分组,那个类)
    Trigger trigger = TriggerUtils.MakeDailyTrigger("tigger1", indexStartHour, indexStartMin);//每天10点00分执行
    trigger.JobName = "job1";
    trigger.JobGroup = "group1";
    trigger.Group = "group1";

    sched.AddJob(job, true);
    sched.ScheduleJob(trigger);
    sched.Start();

    3.Application_End时

    sched.Shutdown(true);//结束时关掉

    4.具体要执行的代码在TestJob中的 public void Execute(JobExecutionContext context)方法中

    ----------------------------------------------------------------------------

    现在做一个B/S项目需要用到计划任务,本来想自定写一个的,写了几句,突然想看看网上有没有现成可以用的.
    结果在苦寻之下找到了Quartz这个组件.看过之后感觉还不错.决定用它实现计划任务了.
    再找找看有没有现成的任务.但找了大半天.大多数都是C/S结构中用的.

    于是就把自已的写的Demo放到网上,供大家参考一下,如有不正确之 处,还请大家多多指教!

    第一步:
    引用三个dll文件:Nullables.dll,Quartz.dll,Common.Logging.dll
    没有引用Common.Logging.dll出出错.也没多看,大家可以看一下为什么!

    第二步:

    配置Web.Config文件

    [csharp] view plaincopy
     
    1. <configSections>  
    2.     <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
    3.     <sectionGroup name="common">  
    4.       <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />  
    5.     </sectionGroup>  
    6.   </configSections>  
    7.   
    8.   <common>  
    9.     <logging>  
    10.       <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">  
    11.         <arg key="showLogName" value="true" />  
    12.         <arg key="showDataTime" value="true" />  
    13.         <arg key="level" value="DEBUG" />  
    14.         <arg key="dateTimeFormat" value="HH:mm:ss:fff" />  
    15.       </factoryAdapter>  
    16.     </logging>  
    17.   </common>  
    18.   
    19.   <quartz>  
    20.     <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler" />  
    21.   
    22.     <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />  
    23.     <add key="quartz.threadPool.threadCount" value="10" />  
    24.     <add key="quartz.threadPool.threadPriority" value="2" />  
    25.   
    26.     <add key="quartz.jobStore.misfireThreshold" value="60000" />  
    27.     <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />  
    28.   </quartz>  


    第三步:
    在页面上新建两个按钮:

    第一个按钮执行简单的计划任务
    如:几秒钟执行几次

    第一个按钮执行复杂的计划任务
    如:每天的夜间2:00执行一次,这种复杂的任务

    在简单按钮单击事件,代码如下:

    [csharp] view plaincopy
     
    1. ISchedulerFactory sf = new StdSchedulerFactory();  
    2.             IScheduler sched = sf.GetScheduler();  
    3.             JobDetail job = new JobDetail("job2", "group2", typeof(JobExecute_2));  
    4.             SimpleTrigger trigger = new SimpleTrigger("trigger2", "group2");//不同的计划任务,trigger名称不可以相同!  
    5.             trigger.StartTime = DateTime.Now.AddSeconds(5);  
    6.             trigger.RepeatInterval = 5000;  
    7.             trigger.RepeatCount = 1000;  
    8.             DateTime ft = sched.ScheduleJob(job, trigger);  
    9.             sched.Start();  

    JobExecute_2这个类就是要执行的具体任务,必继继承Ijob这个接口

    代码:

    [csharp] view plaincopy
     
    1. public class JobExecute_2:IJob  
    2.    {  
    3.        #region IJob 成员  
    4.        private static int n = 0;  
    5.        public void Execute(JobExecutionContext context)  
    6.        {  
    7.            ILog log = LogManager.GetLogger(typeof(JobExecute_2));  
    8.              
    9.            StreamWriter w = null;  
    10.            try  
    11.            {  
    12.                n++;  
    13.                w = new StreamWriter("D:\2.txt", true, System.Text.Encoding.UTF8);  
    14.                w.WriteLine("------------------------------------");  
    15.                w.WriteLine(n+" JobExecute_1正执行:时间:" + DateTime.Now);  
    16.                w.WriteLine("------------------------------------");  
    17.                  
    18.            }  
    19.            finally  
    20.            {  
    21.                if (w != null)  
    22.                {  
    23.                    w.Close();  
    24.                    w.Dispose();  
    25.                }  
    26.            }  
    27.        }  
    28.  
    29.        #endregion  
    30.    }  


    复杂任务计划如下:

    按钮单击事件:

    [csharp] view plaincopy
     
    1. ISchedulerFactory sf = new StdSchedulerFactory();  
    2.            IScheduler sched = sf.GetScheduler();  
    3.            JobDetail job = new JobDetail("job1", "group1", typeof(JobExecute_1));  
    4.            CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1", "group1");  
    5.            //二十秒执行一次  
    6.            trigger.CronExpressionString = "0/20 * * * * ?";  
    7.            sched.AddJob(job, true);  
    8.            DateTime ft = sched.ScheduleJob(trigger);  
    9.            sched.Start();  
    [csharp] view plaincopy
     
      1. JobExecute_1类具体代码:  
      2. <pre name="code" class="csharp"> private static int i = 0;  
      3.         public void Execute(JobExecutionContext context)  
      4.         {  
      5.             StreamWriter w = null;  
      6.             try  
      7.             {  
      8.                 i++;  
      9.                 w = new StreamWriter("D:\1.txt", true, System.Text.Encoding.UTF8);  
      10.                 w.WriteLine("------------------------------------");  
      11.                 w.WriteLine(i+" JobExecute_1正执行:时间:" + DateTime.Now);  
      12.                 w.WriteLine("------------------------------------");  
      13.                  
      14.             }  
      15.             finally  
      16.             {  
      17.                 w.Close();  
      18.                 w.Dispose();  
      19.             }  
      20. ------------------------------------------------------------------------------------------------
      21. 轻装上阵:无配置文件情况下使用Quartz.NET

         

        写博客写上瘾了,怎么办?

        本来没打算写这篇随笔,但是今天突然解决了Quartz.NET的一个问题,实在想分享一下。网上搜索到的一堆Quartz.NET文章,都是谈如何通过配置文件来使用Quartz.NET。

        我们只是想简单使用一下,取代原来在Windows中使用的任务计划,每天定时发两封提醒邮件,实在不想在一堆配置中挣扎。

        先简单介绍一下Quartz.NET

        Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

        以上简介内容引用自leeolevis写的“Quartz.NET作业调度框架详解”。

        下面我们用几行代码搞定它。

        1. 定义要执行的任务(实现Quartz.IJob接口),代码如下:

        复制代码
        public class ShiftNotify : IJob
        {
        public void Execute(JobExecutionContext context)
        {
        //在此执行计划任务
        //比如:“时间不早了,该起床啦!”
        }
        }
        复制代码

        2. 将要计划执行的任务加入到调度器中。

        完成这一步,需要三样东西:调度器(IScheduler)、任务(JobDetail)、触发器(Trigger)。

        由于是在Web应用程序中进行调度,代码需要写在Global.asax.cs的Application_Start()方法中。

        a) 创建一个调度器(职责:如果触发器设定的条件满足,就让预先定义好的任务干活):

        ISchedulerFactory factory = new StdSchedulerFactory();
        IScheduler scheduler = factory.GetScheduler();
        scheduler.Start();

        b) 创建一个任务(第1步已经定义好的任务,真正干活的):

        JobDetail job = new JobDetail("MyJob", typeof(ShiftNotify));

        c) 创建一个触发器(从什么时间开始,多长时间触发一次):

        Trigger trigger = TriggerUtils.MakeMinutelyTrigger(1);
        trigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow);
        trigger.Name = "ShiftNotify";

        第一行代码设置的是1分钟触发一次。

        第二行代码设置的是开始时间。之前遇到的问题就出现在这里。将DateTime.UtcNow写成了DateTime.Now,怎么也触发不了。

        d) 将任务与触发器添加到调度器中:

        scheduler.ScheduleJob(job, trigger);

        好了,完工!

        不需要任何配置文件,Quartz.NET就按你的指令,定时为你服务了。

  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/fx2008/p/4243282.html
Copyright © 2011-2022 走看看