之前使用自动任务的,会写一个程序通过使用windows任务计划来调度,其实.net下有自动任务框架可以使用,一直没有拿来用,现在准备用下,所以找了些资料学习了下,记录下。
安装Install-Package Quartz -Version 2.5.0 我使用的2.5的版本来进行测试 目前已经到3.X版本了
主要是三个dll,Common.Logging.dll,Common.Logging.Core.dll,Quartz.dll
接下来就可以做简单的测试了,大概步骤如下:
1.继承作业接口Ijob建立job
2.建立作业调度器Scheduler
3.通过JobBuilder生成一个任务job
4.通过TriggerBuilder建立一个触发器trigger
5.将job和trigger加入调度器Scheduler中
创建一个任务 通过继承接口IJob需要实现Execute方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Quartz;
namespace quartzdemo
{
public class demojob1:IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("execute job");
}
}
}
创建调度器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;
namespace quartzdemo
{
public class demoscheule
{
public static void start(){
//-------demo1 无参数 简单调用的方法-----------------
ISchedulerFactory schedulefactory = new StdSchedulerFactory();//实例化调度器工厂
IScheduler scheduler = schedulefactory.GetScheduler();//实例化调度器
scheduler.Start();
IJobDetail job1 = JobBuilder.Create<demojob1>()//创建一个作业
.WithIdentity("demojob1", "groupa")
.Build();
ITrigger trigger1 = TriggerBuilder.Create()//创建一个触发器
.WithIdentity("demotrigger1", "groupa")
.StartNow()
.WithSimpleSchedule(b => b.WithIntervalInSeconds(5)//5秒执行一次
.RepeatForever())//无限循环执行
.Build();
scheduler.ScheduleJob(job1, trigger1);//把作业,触发器加入调度器
}
}
}
将此调度器执行
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace quartzdemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("job start");
demoscheule.start();
Console.ReadKey();
}
}
}
执行后就会出现如下结果
使用JobDataMap
如果任务中需要带参数,Quartz.Net也是支持的 可以通过JobDataMap来进行参数的传递
我们只需要修改下Job方法和创建job的JobBuilder中加入参数就可以
新的job方法接收参数id
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Quartz;
namespace quartzdemo
{
public class demojob2:IJob
{
public void Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
string str = dataMap.GetString("id");
Console.WriteLine("execute job:{0}",str);
}
}
}
修改后的调度器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;
namespace quartzdemo
{
public class demoscheule
{
public static void start(){
ISchedulerFactory schedulefactory = new StdSchedulerFactory();//实例化调度器工厂
IScheduler scheduler = schedulefactory.GetScheduler();//实例化调度器
scheduler.Start();
//------------demo2 带参数的调用方法
IJobDetail job2 = JobBuilder.Create<demojob2>()
.WithIdentity("demojob2", "groupa")
.UsingJobData("id", "1")
.Build();
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("demotrigger2", "groupa")
.StartNow()
.WithSimpleSchedule(b => b.WithIntervalInSeconds(3).WithRepeatCount(2))//3秒执行一次执行两次后停止 开始运行会执行一次
.Build();
scheduler.ScheduleJob(job2, trigger2);
}
}
}
执行后的结果
通过配置文件来进行任务调度
上面我们进行任务调度都是通过代码来实现的,当我们要修改调度规则的时候就要重新编译代码这是很不方便的,Quartz.Net提供了通过配置文件的方式来进行操作
首先我们在web.config或app.config里进行配置<quartz></quartz>节点的数据
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--需方到开始的位置 刚开始放到statuup位置下面一直报错调整了下位置就ok了-->
<configSections>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<quartz>
<add key="quartz.scheduler.instanceName" value="ServerScheduler" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.plugin.xml.type" value = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
<add key="quartz.plugin.xml.fileNames" value = "quartz_jobs.xml" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
</quartz>
</configuration>
然后新建任务配置文件quartz_jobs.xml
我们通过nuget安装的时候在项目中应该有一个job_scheduling_data_2_0.xsd文件
打开quartz_jobs.xml是选择工具栏XML然后选择架构,导入job_scheduling_data_2_0.xsd,之后你写着个任务配置的时候就会有提示了
,
配置文件如下
此文件要在属性中设置“始终复制”到输出目录
<?xml version="1.0" encoding="utf-8" ?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.0">
<processing-directives>
<overwrite-existing-data>true</overwrite-existing-data>
</processing-directives>
<schedule>
<job>
<name>demojob1</name>
<group>groupa</group>
<description>demo</description>
<job-type>quartzdemo.demojob1,quartzdemo</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<simple>
<name>demotrigger1</name>
<group>groupa</group>
<description>demo</description>
<job-name>demojob1</job-name>
<job-group>groupa</job-group>
<misfire-instruction>SmartPolicy</misfire-instruction>
<repeat-count>-1</repeat-count>
<repeat-interval>3000</repeat-interval>
</simple>
</trigger>
</schedule>
</job-scheduling-data>
参考:http://www.cnblogs.com/mushroom/p/4067037.html