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,操作更方便哦