• 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就按你的指令,定时为你服务了。

  • 相关阅读:
    损失函数
    DPM 目标检测1
    编程题
    枚举型和元类
    python 多继承
    网络基础Cisco路由交换一
    网络基础tcp/ip协议五
    网络基础tcp/ip协议四
    网络基础tcp/ip协议三
    网络基础tcp/ip协议二
  • 原文地址:https://www.cnblogs.com/fx2008/p/4243282.html
Copyright © 2020-2023  润新知