C#調用Quartz 定時任務。使用Cron表達式的方法


最近在做一個定時任務,要求是每一分鍾觸發一次。

由於之前是采用的FluentScheduler寫的,現在改成了Cron表達式。中間出現了一些問題,所以現在寫下來,和大家分享一下。

先說一下准備工作,你需要這么三個dll:

將他們添加到指定的位置就可以了。

定時任務,我們要做的就是在一開始運行項目的時候讓他啟動,所以在Global.asax里面的這個方法里面增加圈出的這個方法,指向你另一個類中的方法。

我是指向了這么一個類PlanRegistry,這里面的這個Start方法:

public static void Start()

{
string QuestionCron = ConfigurationManager.AppSettings["quarterCon"] == null ? "0 0/1 * * * ? *" : ConfigurationManager.AppSettings["quarterCon"];

////新建一個調度器工工廠
ISchedulerFactory factory = new StdSchedulerFactory();
////使用工廠生成一個調度器
IScheduler scheduler = factory.GetScheduler();
//啟動調度器
scheduler.Start();
IJobDetail job = JobBuilder.Create<CreateCheckTaskJob>().Build();
// 新建一個觸發器
ITrigger trigger = TriggerBuilder.Create().StartNow().WithCronSchedule(QuestionCron).Build();
//將任務與觸發器關聯起來放到調度器中
scheduler.ScheduleJob(job, trigger);
}

 

這個地方有一個點需要注意,那就是這個quarterCon,我們需要從我們的Web.Config配置文件中讀取。

<!--定時器:每一分鍾觸發一次-->
<add key="quarterCon" value="0 0/1 * * * ? *" />

將這個Cron表達式,加在appSettings里面即可,名字以及執行的方式方法你都可以自定義,另外Cron表達式的寫法,網上很多,也有很多的在線生成工具,不在陳述。

任務啟動之后,我們會跳轉到這么一個類,就是你自己定義的關於你后台邏輯的類了,我們這里的是CreateCheckTaskJob:

這個地方的方法,需要繼承一個Ijob的類:

public void Execute(IJobExecutionContext context)
{
}

這是這個方法的空函數,你可以在里面加你自己需要的方法。

到這里,基本上就結束了,總結幾個出錯的地方:

1.提示Common.Logging的版本問題:

未能加載文件或程序集“Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f

那說明你引入的dll版本異常

你可以嘗試看一下,你現在引入的版本是多少,在看一下,你配置文件里面定義的版本是多少,統一起來,我這里是采用的3.3.1.0。

另外你也需要在配置文件中加入以下內容

<dependentAssembly>
<assemblyIdentity name="Common.Logging" publicKeyToken="AF08829B84F0328E" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-3.3.1.0" newVersion="3.3.1.0"/>
</dependentAssembly>

加入此依賴。

另外就是根據需要在packages.config里面加入上述的包引用。

 2.Quartz.Impl.StdSchedulerFactory'的類型初始值設定項引發異常

如果出現此問題,是由於 app.config 或者 web.config 不包含 commonlogging 節,構造函數失敗。你的.config 文件包含以下部分:

 <configSections> <sectionGroup name="common"> <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/> </sectionGroup> </configSections> <common> <logging> <factoryAdapter type="Common.Logging.Simple.TraceLoggerFactoryAdapter, Common.Logging"> <arg key="level" value="DEBUG"/> <arg key="showLogName" value="true"/> <arg key="showDataTime" value="true"/> <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:fff"/> </factoryAdapter> </logging> </common>
另外可能還需要加入Quarz的配置: <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

<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>

這部分都應該放在configSections里面。

 最后,附上三個我使用的dll,供大家使用,請注意版本不同會有影響的。

 

鏈接:https://pan.baidu.com/s/1TGKF4rMeW-uAi5IIZa3uGg
提取碼:5gtn
復制這段內容后打開百度網盤手機App,操作更方便哦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM