您的位置:首页 > 其它

Quartz.Net的使用(简单配置方法)定时任务框架

2015-01-23 09:33 288 查看
Quartz.dll 安装nuget在线获取dll包管理器,从中获取最新版
Quartz.Net是一个定时任务框架,可以实现异常灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。
Quartz.Net中的概念:计划者(IScheduler)、工作(IJob)、触发器(Trigger)。给计划者一个工作,让他在Trigger(什么条件下做这件事)触发的条件下执行这个工作
将要定时执行的任务的代码写到实现IJob接口的Execute方法中即可,时间到来的时候Execute方法会被调用。
CrondTrigger是通过Crond表达式设置的触发器,还有 SimpleTrigger等简单的触发器。可以通过TriggerUtils的MakeDailyTrigger、MakeHourlyTrigger等方法简化调用。调用代码参考备注。
初始化定时和结束定时的代码放到哪里(Application_Start,Application_End)

1.先在bin文件夹中引用Quartz.Net的dll 文件

Common.Logging.dll,Quartz.dll

2.Global文件中的Application_Start。

//从配置中读取任务启动时间
int indexStartHour = Convert.ToInt32(ConfigurationManager.AppSettings["IndexStartHour"]);
int indexStartMin = Convert.ToInt32(ConfigurationManager.AppSettings["IndexStartMin"]);

ISchedulerFactory sf = new StdSchedulerFactory();//执行者
sched = sf.GetScheduler();

JobDetail job = new JobDetail("job1", "group1", typeof(TestJob));//TestJob为实现了IJob接口的类,(工作名称,分组,那个类)
Trigger trigger = TriggerUtils.MakeDailyTrigger("tigger1", indexStartHour, indexStartMin);//每天10点00分执行
trigger.JobName = "job1";
trigger.JobGroup = "group1";
trigger.Group = "group1";

sched.AddJob(job, true);
sched.ScheduleJob(trigger);
sched.Start();

3.Application_End时

sched.Shutdown(true);//结束时关掉

4.具体要执行的代码在TestJob中的 public void Execute(JobExecutionContext context)方法中

----------------------------------------------------------------------------

现在做一个B/S项目需要用到计划任务,本来想自定写一个的,写了几句,突然想看看网上有没有现成可以用的.
结果在苦寻之下找到了Quartz这个组件.看过之后感觉还不错.决定用它实现计划任务了.
再找找看有没有现成的任务.但找了大半天.大多数都是C/S结构中用的.

于是就把自已的写的Demo放到网上,供大家参考一下,如有不正确之 处,还请大家多多指教!

第一步:
引用三个dll文件:Nullables.dll,Quartz.dll,Common.Logging.dll
没有引用Common.Logging.dll出出错.也没多看,大家可以看一下为什么!

第二步:

配置Web.Config文件

[csharp] view plaincopy

<configSections>

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

第三步:
在页面上新建两个按钮:

第一个按钮执行简单的计划任务
如:几秒钟执行几次

第一个按钮执行复杂的计划任务
如:每天的夜间2:00执行一次,这种复杂的任务

在简单按钮单击事件,代码如下:

[csharp] view plaincopy

ISchedulerFactory sf = new StdSchedulerFactory();

IScheduler sched = sf.GetScheduler();

JobDetail job = new JobDetail("job2", "group2", typeof(JobExecute_2));

SimpleTrigger trigger = new SimpleTrigger("trigger2", "group2");//不同的计划任务,trigger名称不可以相同!

trigger.StartTime = DateTime.Now.AddSeconds(5);

trigger.RepeatInterval = 5000;

trigger.RepeatCount = 1000;

DateTime ft = sched.ScheduleJob(job, trigger);

sched.Start();

JobExecute_2这个类就是要执行的具体任务,必继继承Ijob这个接口

代码:

[csharp] view plaincopy

public class JobExecute_2:IJob

{

#region IJob 成员

private static int n = 0;

public void Execute(JobExecutionContext context)

{

ILog log = LogManager.GetLogger(typeof(JobExecute_2));

StreamWriter w = null;

try

{

n++;

w = new StreamWriter("D:\\2.txt", true, System.Text.Encoding.UTF8);

w.WriteLine("------------------------------------");

w.WriteLine(n+" JobExecute_1正执行:时间:" + DateTime.Now);

w.WriteLine("------------------------------------");

}

finally

{

if (w != null)

{

w.Close();

w.Dispose();

}

}

}

#endregion

}

复杂任务计划如下:

按钮单击事件:

[csharp] view plaincopy

ISchedulerFactory sf = new StdSchedulerFactory();

IScheduler sched = sf.GetScheduler();

JobDetail job = new JobDetail("job1", "group1", typeof(JobExecute_1));

CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1", "group1");

//二十秒执行一次

trigger.CronExpressionString = "0/20 * * * * ?";

sched.AddJob(job, true);

DateTime ft = sched.ScheduleJob(trigger);

sched.Start();

[csharp] view plaincopy

JobExecute_1类具体代码:

<pre name="code" class="csharp"> private static int i = 0;

public void Execute(JobExecutionContext context)

{

StreamWriter w = null;

try

{

i++;

w = new StreamWriter("D:\\1.txt", true, System.Text.Encoding.UTF8);

w.WriteLine("------------------------------------");

w.WriteLine(i+" JobExecute_1正执行:时间:" + DateTime.Now);

w.WriteLine("------------------------------------");

}

finally

{

w.Close();

w.Dispose();

}

------------------------------------------------------------------------------------------------

轻装上阵:无配置文件情况下使用Quartz.NET

写博客写上瘾了,怎么办?

本来没打算写这篇随笔,但是今天突然解决了Quartz.NET的一个问题,实在想分享一下。网上搜索到的一堆Quartz.NET文章,都是谈如何通过配置文件来使用Quartz.NET。

我们只是想简单使用一下,取代原来在Windows中使用的任务计划,每天定时发两封提醒邮件,实在不想在一堆配置中挣扎。

先简单介绍一下Quartz.NET

Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

以上简介内容引用自leeolevis写的“Quartz.NET作业调度框架详解”。

下面我们用几行代码搞定它。

1. 定义要执行的任务(实现Quartz.IJob接口),代码如下:

public class ShiftNotify : IJob
{
public void Execute(JobExecutionContext context)
{
//在此执行计划任务
//比如:“时间不早了,该起床啦!”
}
}

2. 将要计划执行的任务加入到调度器中。

完成这一步,需要三样东西:调度器(IScheduler)、任务(JobDetail)、触发器(Trigger)。

由于是在Web应用程序中进行调度,代码需要写在Global.asax.cs的Application_Start()方法中。

a) 创建一个调度器(职责:如果触发器设定的条件满足,就让预先定义好的任务干活):

ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler();
scheduler.Start();

b) 创建一个任务(第1步已经定义好的任务,真正干活的):

JobDetail job = new JobDetail("MyJob", typeof(ShiftNotify));

c) 创建一个触发器(从什么时间开始,多长时间触发一次):

Trigger trigger = TriggerUtils.MakeMinutelyTrigger(1);
trigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow);
trigger.Name = "ShiftNotify";

第一行代码设置的是1分钟触发一次。

第二行代码设置的是开始时间。之前遇到的问题就出现在这里。将DateTime.UtcNow写成了DateTime.Now,怎么也触发不了。

d) 将任务与触发器添加到调度器中:

scheduler.ScheduleJob(job, trigger);

好了,完工!

不需要任何配置文件,Quartz.NET就按你的指令,定时为你服务了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: