zoukankan      html  css  js  c++  java
  • 好脑袋不如烂笔头-Quartz使用总结

    Quartz是Java平台的一个开源的作业调度框架。Quartz.net是从java版本移植到.net版本的。.net项目使用Quartz来执行批处理等定时任务非常方便。

    (1)从nuget上可以安装Quartz.net

    (2)quartz配置:

    <configSections>
      <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </configSections>
    <quartz>
      <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
      <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
      <add key="quartz.threadPool.threadCount" value="10"/>
      <add key="quartz.threadPool.threadPriority" value="2"/>
      <add key="quartz.jobStore.misfireThreshold" value="60000"/>
      <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
    </quartz>
    <appSettings>
      <!--cronexpression表达式:从每分钟的第2秒开始,每间隔5秒执行-->
      <add key="cronExpr" value="2/5 * * * * ?"/>
    </appSettings>

    (3)创建一个普通类,实现Quartz.IJob接口

    接口很简单,只有一个Execute()方法(跟java里一样),在这个方法里写你要做的处理逻辑。

    public class MyJob : Quartz.IJob
    {
        public void Execute(Quartz.IJobExecutionContext context)
        {
            // 你的处理逻辑,也就是“工作”
            Console.WriteLine(DateTime.Now);
        }
    }

    (4)启动工作调度

    
    

    using Quartz;
    using Quartz.Impl;
    using Quartz.Impl.Triggers;

    class Program
    {
        static void Main(string[] args)
        {        
                // Initializes a new instance of the Quartz.Impl.StdSchedulerFactory class.
                ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory();
                // Returns a client-usable handle to a Quartz.IScheduler.
                IScheduler sched = sf.GetScheduler();
                // 定义一个Job(即你的处理逻辑,也就是“工作”)
                IJobDetail job = new JobDetailImpl("job1", "group1", typeof(MyJob));
    
                // 定义触发器(读取AppSettings)
                string cronExpr = ConfigurationManager.AppSettings["cronExpr"];
                ITrigger trigger = new CronTriggerImpl("trigger1", "group1", "job1", "group1", cronExpr);
    
                // 将给定的Job添加到调度器里
                sched.AddJob(job, true, true);
                // 为Job指派触发器
                sched.ScheduleJob(trigger);
                // 启动调度器线程
                sched.Start();
    
    
                Console.Read();
        }
    }

    我这里是一个控制台程序。对于web程序或服务程序,当Application_End的时候,需要调用Scheduler的Shutdown()方法来关闭Quartz的工作。

    注意IScheduler有两个重载的AddJob方法:

    namespace Quartz
    {
        public interface IScheduler
        {
            //
            // 摘要: 
            //     Add the given Quartz.IJob to the Scheduler - with no associated Quartz.ITrigger.
            //     The Quartz.IJob will be 'dormant' until it is scheduled with a Quartz.ITrigger,
            //     or Quartz.IScheduler.TriggerJob(Quartz.JobKey) is called for it.
            //
            // 备注: 
            //     The Quartz.IJob must by definition be 'durable', if it is not, SchedulerException
            //     will be thrown.
            void AddJob(IJobDetail jobDetail, bool replace);
            //
            // 摘要: 
            //     Add the given Quartz.IJob to the Scheduler - with no associated Quartz.ITrigger.
            //     The Quartz.IJob will be 'dormant' until it is scheduled with a Quartz.ITrigger,
            //     or Quartz.IScheduler.TriggerJob(Quartz.JobKey) is called for it.
            //
            // 备注: 
            //     With the storeNonDurableWhileAwaitingScheduling parameter set to true, a
            //     non-durable job can be stored. Once it is scheduled, it will resume normal
            //     non-durable behavior (i.e. be deleted once there are no remaining associated
            //     triggers).
            void AddJob(IJobDetail jobDetail, bool replace, bool storeNonDurableWhileAwaitingScheduling);
        }
    }

    上面的AddJob要调用void AddJob(IJobDetail jobDetail, bool replace, bool storeNonDurableWhileAwaitingScheduling);把storeNonDurableWhileAwaitingScheduling参数设置为true。否则会抛出SchedulerException异常:

    未处理Quartz.SchedulerException
      HResult=-2146233088
      Message=Jobs added with no trigger must be durable.
      Source=Quartz
      StackTrace:
           在 Quartz.Core.QuartzScheduler.AddJob(IJobDetail jobDetail, Boolean replace, Boolean storeNonDurableWhileAwaitingScheduling) 位置 c:Program Files (x86)JenkinsworkspaceQuartz.NETsrcQuartzCoreQuartzScheduler.cs:行号 788
           在 Quartz.Core.QuartzScheduler.AddJob(IJobDetail jobDetail, Boolean replace) 位置 c:Program Files (x86)JenkinsworkspaceQuartz.NETsrcQuartzCoreQuartzScheduler.cs:行号 779
           在 Quartz.Impl.StdScheduler.AddJob(IJobDetail jobDetail, Boolean replace) 位置 c:Program Files (x86)JenkinsworkspaceQuartz.NETsrcQuartzImplStdScheduler.cs:行号 286
           在 UnitTest.Program.Main(String[] args) 位置 d:SourceProjectinfrastructure.sms	runkUnitTestProgram.cs:行号 36
           在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           在 System.Threading.ThreadHelper.ThreadStart()
    
    

    (5)接下来,就可以允许程序,查看效果了。

    关于quartz的CronExpression表达式:

    常用示例: 

    0 0 12 * * ?    每天12点触发    

    0 15 10 ? * *    每天10点15分触发    

    0 15 10 * * ?    每天10点15分触发    

    0 15 10 * * ? *    每天10点15分触发    

    0 15 10 * * ? 2005    2005年每天10点15分触发    

    0 * 14 * * ?    每天下午的 2点到2点59分每分触发    

    0 0/5 14 * * ?    每天下午的 2点到2点59分(整点开始,每隔5分触发)    

    0 0/5 14,18 * * ?    每天下午的 2点到2点59分、18点到18点59分(整点开始,每隔5分触发)    

    0 0-5 14 * * ?    每天下午的 2点到2点05分每分触发    

    0 10,44 14 ? 3 WED    3月份每周三下午的 2点10分和2点44分触发    

    0 15 10 ? * MON-FRI    从周一到周五每天上午的10点15分触发    

    0 15 10 15 * ?    每月15号上午10点15分触发    

    0 15 10 L * ?    每月最后一天的10点15分触发    

    0 15 10 ? * 6L    每月最后一周的星期五的10点15分触发    

    0 15 10 ? * 6L 2002-2005    从2002年到2005年每月最后一周的星期五的10点15分触发    

    0 15 10 ? * 6#3    每月的第三周的星期五开始触发    

    0 0 12 1/5 * ?    每月的第一个中午开始每隔5天触发一次    

    0 11 11 11 11 ?    每年的11月11号 11点11分触发(光棍节)    

  • 相关阅读:
    HOT: AgentFramework 即将发布
    关于配置 Apache + SVN 1.5 + SSL
    LINQ to SQL(LINQ2SQL) vs. ADO.NET Entity Framework(ADOEF)ccBoy版 阅读笔记
    关于导出属性
    linq to sql 与linq to entities的选择
    linq to sql 算ORM吗?
    匿名方法实现(转)
    Aop中动态横切与静态横切
    老张的灵魂——敏捷回顾
    忙于webmis中
  • 原文地址:https://www.cnblogs.com/buguge/p/5485111.html
Copyright © 2011-2022 走看看