1. 程式人生 > >基於Quartz.Net類庫的Cron定時任務(例項)

基於Quartz.Net類庫的Cron定時任務(例項)

cron常用表示式

標準格式為六位:從左至右依次為“秒 分 時 日 月 周”

七位格式:從左至右依次為“秒 分 時 日 月 周 年”

  • 六位格式年份預設為1970-2099

  • “周” 從1-7,數字或英文縮寫(1或 SUN,MON,TUE,WED,THU,FRI,SAT)

  • * 表示所有可能的值

  • ? 僅被用於天(月)和天(星期)兩個子表示式,表示不指定值,當兩個子表示式其中之一被指定了確定值以後,為了避免衝突,需要將另一個子表示式的值設為“?”

  • 在確定周幾的時候,“日”一定得判斷,如【0 15 10 ? * MON-FRI】,“日”用“?”,不能用“ * ”

常用示例

【0 * 14 * * ?】: 每天下午的 2點到2點59分每分觸發
【0 0-30 0-23 ? * 1-5】: 週一到週五內每天0-23:59點之間0-30分鐘執行
【0 15 10 ? * MON-FRI 】: 從週一到週五每天上午的10點15分觸發
【0/3 * * ? * MON-FRI 】: 從週一到週五每天每3秒觸發
【0 * 14 * * ? 】: 每天下午的 2點到2點59分每分觸發

【0 15 10 * * ? 2005】: 2005年每天10點15分觸發

基於Quartz.Net類庫的 C# 實現

  1. 引入 Quartz.Net 類庫
  2. 配置檔案
<configuration>
  <configSections>  <!--此配置節必須緊跟configuration,且只有一個-->
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
    </sectionGroup>
  </configSections>

  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
        <arg key="showLogName" value="true" />
        <arg key="showDataTime" value="true" />
        <arg key="level" value="DEBUG" />
        <arg key="dateTimeFormat" value="HH:mm:ss:fff" />
      </factoryAdapter>
    </logging>
  </common>

  <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>
  <!--自定義配置:每五分鐘執行一次-->
  <add key="cron" value="* 5 * * * ?"/>
  </appSettings>
</configuration>


3.程式碼編寫,以控制檯程式為例,在自定義的觸發時間內重複執行指定方法,常用於服務的編寫

using Quartz;
using Quartz.Impl;
using System;
namespace QuartzTest
{
    public class Program
    {
        static void Main(string[] args)
        {
            UseJob();
            Console.ReadKey();
        }

        public static void UseJob()
        {
            IJobDetail jobDetail = JobBuilder.Create(typeof(MyJob)).WithIdentity("TestJob1", "Group1").Build();

            ITrigger trigger = TriggerBuilder.Create().WithIdentity("TestJob1", "Group1").StartNow().WithCronSchedule("1 37 9 * * ?").Build();   //"0/3 * 0-23 12 9 ?"  9月12日0-23點中每3秒

            ISchedulerFactory sf = new StdSchedulerFactory();
            IScheduler sched = sf.GetScheduler();
            //var sched = StdSchedulerFactory.GetDefaultScheduler();
            sched.Start();

            sched.ScheduleJob(jobDetail, trigger);
        }
    }

    
    /// <summary>
    /// 方法實體,繼承於IJob
    /// </summary>
    public class MyJob:IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("****************************");
            Console.WriteLine("我的任務!!!");
            Console.WriteLine("****************************");

        }
    }

}