最近几天的学习中,感觉收获颇多,学习的知识也挺实用的,在这我将介绍其中一个小技术。在项目中,要求每天能定时索引当天最新的帖子,但是,我们不可能派一个人每天点击“开始索引”按钮,而应该是计算机定时自动去触发索引的动作。有哪些方法可以用来实现这种定时任务了?
大家最容易想到的应该是用Timer定时器来实现,还有像Windows系统的定时任务……在这,我将采用Quartz.Net框架来实现。
Quartz.Net是一个定时任务框架,可以实现灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。下面我们来看看如何实现这一功能。
在开始之前,我们必须先做好准备工作。首先为项目添加两个引用,分别是Quartz.dll和Common.Logging.dll。
好了,准备工作已经做好了,我们正式切入主题。
我们先来创建一个创建索引任务类:IndexJob.cs,该类实现IJob接口。
public class IndexJob:IJob
{
public void Execute(JobExecutionContext context)
{
// 在此处放置需要定时执行的代码
}
}
任务类创建好了,接下来我们来看看如何来执行这个任务。
在程序启动的时候启动这个定时任务,那么我们应该将这个启动定时任务的代码放在程序中的哪个位置呢?
第一个用户访问我们的WebApplication的时候,Application_Start才运行。因此,我们应该将启动定时任务的代码放在Global.asax文件的Application_Start方法内;
void Application_Start( object sender, EventArgs e)
{
// 定时任务
IScheduler sched;
ISchedulerFactory Ifactory = new StdSchedulerFactory();
sched = Ifactory.GetScheduler();
JobDetail jobDetails = new JobDetail( " IndexJob " , " group1 " , typeof (IndexJob));
DateTime dt = TriggerUtils.GetNextGivenSecondDate( null , 5 ); // 任务第一次执行在分配任务后5秒
TimeSpan interval = TimeSpan.FromHours( 2 ); // 执行任务的时间间隔,此处为两小时//SimpleTrigger.RepeatIndefinitely表示该任务将每隔5小时无限制的执行
Trigger trigger = new SimpleTrigger( " IndexTrigger " , " group1 " , " IndexJob " , " group1 " , dt, null ,SimpleTrigger.RepeatIndefinitely, interval);
sched.AddJob(jobDetails, true );
sched.ScheduleJob(trigger);
sched.Start(); // 只有start后任务才被启动
}
定时启动任务到此就完成了。
要关闭任务定时则需要sched.Shutdown(true)。