之前使用自动任务的,会写一个程序通过使用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()//创建一个作业
.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();
}
}
}
执行后就会出现如下结果
如果任务中需要带参数,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()
.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_jobs.xml
我们通过nuget安装的时候在项目中应该有一个job_scheduling_data_2_0.xsd文件
打开quartz_jobs.xml是选择工具栏XML然后选择架构,导入job_scheduling_data_2_0.xsd,之后你写着个任务配置的时候就会有提示了
配置文件如下
此文件要在属性中设置“始终复制”到输出目录
true
demojob1
groupa
demo
quartzdemo.demojob1,quartzdemo
true
false
demotrigger1
groupa
demo
demojob1
groupa
SmartPolicy
-1
3000
参考:http://www.cnblogs.com/mushroom/p/4067037.html
https://blog.csdn.net/hao_ds/article/details/42418877
https://www.cnblogs.com/blackice/p/5590881.html