admin 管理员组

文章数量: 1086019

asp.net mvc 项目使用Quartz.net添加定时任务

文章目录

    • 1、安装Quartz.net
    • 2、创建定时任务工具类“QuartzUtil”
    • 3、创建任务运行类
    • 4、在程序启动类里启动定时任务引擎
    • 5、调用定时任务
    • 6、DEMO实例下载

1、安装Quartz.net

(1)打开“程序包管理器控制台(PM)”

(2)执行命令

 PM> Install-Package Quartz 

2、创建定时任务工具类“QuartzUtil”

using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Quartz;
using Quartz.Impl;
using Quartz.Impl.Triggers;namespace VideoMonitorPlatform.Utils
{public class QuartzUtil{private static ISchedulerFactory sf = null;private static IScheduler sched = null;static QuartzUtil(){}public static async void Init(){sf = new StdSchedulerFactory();sched = await sf.GetScheduler();await sched.Start();}/// <summary>/// 添加Job 并且以定点的形式运行/// </summary>/// <typeparam name="T"></typeparam>/// <param name="JobName"></param>/// <param name="CronTime"></param>/// <param name="jobDataMap"></param>/// <returns></returns>public static async Task AddJob<T>(string JobName, string CronTime, Dictionary<string, object> map) where T : IJob{IJobDetail jobCheck = JobBuilder.Create<T>().WithIdentity(JobName, JobName + "_Group").Build();jobCheck.JobDataMap.PutAll(map);ICronTrigger CronTrigger = new CronTriggerImpl(JobName + "_CronTrigger", JobName + "_TriggerGroup", CronTime);await sched.ScheduleJob(jobCheck, CronTrigger);}/// <summary>/// 添加Job 并且以定点的形式运行/// </summary>/// <typeparam name="T"></typeparam>/// <param name="JobName"></param>/// <param name="CronTime"></param>/// <returns></returns>public static async Task AddJob<T>(string JobName, string CronTime) where T : IJob{await AddJob<T>(JobName, CronTime, null);}/// <summary>/// 添加Job 并且以周期的形式运行/// </summary>/// <typeparam name="T"></typeparam>/// <param name="JobName"></param>/// <param name="StartTime"></param>/// <param name="EndTime"></param>/// <param name="SimpleTime">毫秒数</param>/// <returns></returns>public static async Task AddJob<T>(string JobName, DateTimeOffset StartTime, DateTimeOffset EndTime, int SimpleTime) where T : IJob{await AddJob<T>(JobName, StartTime, EndTime, TimeSpan.FromMilliseconds(SimpleTime));}/// <summary>/// 添加Job 并且以周期的形式运行/// </summary>/// <typeparam name="T"></typeparam>/// <param name="JobName"></param>/// <param name="StartTime"></param>/// <param name="EndTime"></param>/// <param name="SimpleTime"></param>/// <returns></returns>public static async Task AddJob<T>(string JobName, DateTimeOffset StartTime, DateTimeOffset EndTime, TimeSpan SimpleTime) where T : IJob{await AddJob<T>(JobName, StartTime, EndTime, SimpleTime, new Dictionary<string, object>());}/// <summary>/// 添加Job 并且以周期的形式运行/// </summary>/// <typeparam name="T"></typeparam>/// <param name="JobName"></param>/// <param name="StartTime"></param>/// <param name="EndTime"></param>/// <param name="SimpleTime">毫秒数</param>/// <param name="jobDataMap"></param>/// <returns></returns>public static async Task AddJob<T>(string JobName, DateTimeOffset StartTime, DateTimeOffset EndTime, int SimpleTime, string MapKey, object MapValue) where T : IJob{Dictionary<string, object> map = new Dictionary<string, object>();map.Add(MapKey, MapValue);await AddJob<T>(JobName, StartTime, EndTime, TimeSpan.FromMilliseconds(SimpleTime), map);}/// <summary>/// 添加Job 并且以周期的形式运行/// </summary>/// <typeparam name="T"></typeparam>/// <param name="JobName"></param>/// <param name="StartTime"></param>/// <param name="EndTime"></param>/// <param name="SimpleTime"></param>/// <param name="jobDataMap"></param>/// <returns></returns>public static async Task AddJob<T>(string JobName, DateTimeOffset StartTime, DateTimeOffset EndTime, TimeSpan SimpleTime, Dictionary<string, object> map) where T : IJob{IJobDetail jobCheck = JobBuilder.Create<T>().WithIdentity(JobName, JobName + "_Group").Build();jobCheck.JobDataMap.PutAll(map);ISimpleTrigger triggerCheck = new SimpleTriggerImpl(JobName + "_SimpleTrigger", JobName + "_TriggerGroup",StartTime,EndTime,SimpleTriggerImpl.RepeatIndefinitely,SimpleTime);await sched.ScheduleJob(jobCheck, triggerCheck);}/// <summary>/// 修改触发器时间,需要job名,以及修改结果/// CronTriggerImpl类型触发器/// </summary>public static async void UpdateTime(string jobName, string CronTime){TriggerKey TKey = new TriggerKey(jobName + "_CronTrigger", jobName + "_TriggerGroup");CronTriggerImpl cti = await sched.GetTrigger(TKey) as CronTriggerImpl;cti.CronExpression = new CronExpression(CronTime);await sched.RescheduleJob(TKey, cti);}/// <summary>/// 修改触发器时间,需要job名,以及修改结果/// SimpleTriggerImpl类型触发器/// </summary>/// <param name="jobName"></param>/// <param name="SimpleTime">分钟数</param>public static void UpdateTime(string jobName, int SimpleTime){UpdateTime(jobName, TimeSpan.FromMinutes(SimpleTime));}/// <summary>/// 修改触发器时间,需要job名,以及修改结果/// SimpleTriggerImpl类型触发器/// </summary>public static async void UpdateTime(string jobName, TimeSpan SimpleTime){TriggerKey TKey = new TriggerKey(jobName + "_SimpleTrigger", jobName + "_TriggerGroup");SimpleTriggerImpl sti = await sched.GetTrigger(TKey) as SimpleTriggerImpl;sti.RepeatInterval = SimpleTime;await sched.RescheduleJob(TKey, sti);}/// <summary>/// 暂停所有Job/// 暂停功能Quartz提供有很多,以后可扩充/// </summary>public static void PauseAll(){sched.PauseAll();}/// <summary>/// 恢复所有Job/// 恢复功能Quartz提供有很多,以后可扩充/// </summary>public static void ResumeAll(){sched.ResumeAll();}/// <summary>/// 删除Job/// 删除功能Quartz提供有很多,以后可扩充/// </summary>/// <param name="JobName"></param>public static void DeleteJob(string JobName){JobKey jk = new JobKey(JobName, JobName + "_Group");sched.DeleteJob(jk);}/// <summary>/// 卸载定时器/// </summary>/// <param name="waitForJobsToComplete">是否等待job执行完成</param>public static void Shutdown(bool waitForJobsToComplete){sched.Shutdown(waitForJobsToComplete);}/// <summary>/// 判断任务是否已经建立/// </summary>/// <param name="jobName">任务名</param>public static async Task<bool> CheckExist(string jobName){bool isExists = false;TriggerKey triggerKey = new TriggerKey(jobName + "_CronTrigger", jobName + "_TriggerGroup");isExists = await sched.CheckExists(triggerKey);return isExists;}/// <summary>/// 判断简单任务是否已经建立/// </summary>/// <param name="jobName">任务名</param>public static async Task<bool> CheckSimpleExist(string jobName){bool isExists = false;TriggerKey triggerKey = new TriggerKey(jobName + "_SimpleTrigger", jobName + "_TriggerGroup");isExists = await sched.CheckExists(triggerKey);return isExists;}}
}

3、创建任务运行类

创建执行任务的类“CaptureJob”,具体代码如下:

using System;
using Quartz;
using System.Threading.Tasks;
using System.Reflection;
using VideoMonitorPlatform.Services;namespace VideoMonitorPlatform.Utils
{public class CaptureJob : IJob{#region IJob 成员private static log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);public async Task Execute(IJobExecutionContext context){//log.Info("任务运行");DateTime now = DateTime.Now;System.Diagnostics.Debug.WriteLine("*********************JOB【" + context.JobDetail.Key + "】执行开始*********************");System.Diagnostics.Debug.WriteLine("执行时间:" + now.ToString("yyyy-MM-dd HH:mm:ss"));object channelObject = context.JobDetail.JobDataMap.Get("channel");object quailityObject = context.JobDetail.JobDataMap.Get("quaility");object imageSizeObject = context.JobDetail.JobDataMap.Get("imageSize");uint channel = uint.Parse(channelObject.ToString());uint quaility = uint.Parse(quailityObject.ToString());uint imageSize = uint.Parse(imageSizeObject.ToString());NvrService.RealPlayCapture(channel, quaility, imageSize);System.Diagnostics.Debug.WriteLine("*********************JOB【" + context.JobDetail.Key + "】执行结束*********************");}#endregion}
}

4、在程序启动类里启动定时任务引擎

在“Global.asax”类的“Application_Start()”方法里添加如下代码:

            // 启动定时任务引擎QuartzUtil.Init();

5、调用定时任务

调用的代码如下:

        // POST: /api/v1/Monitor/StartCapture[HttpPost][AllowAnonymous]public async Task<ActionResult> StartCapture(){System.Diagnostics.Debug.WriteLine("====================Setting START===================");Object result;string cronTime = "*/10 * * * * ?";Dictionary<string, object> map = new Dictionary<string, object>();map.Add("channel", 0);map.Add("quaility", 6);map.Add("imageSize", 2);string jobName = Constants.CAPTURE_JOB_KEY_PREFIX + "cameraIds";System.Diagnostics.Debug.WriteLine("创建名称为【" + jobName + "】,表达式为【" + cronTime + "】的定时任务");await QuartzUtil.AddJob<CaptureJob>(jobName, cronTime, map);result = new{error = "SUCCESS",error_info = "调用成功"};string jsonstr = JsonConvert.SerializeObject(result);System.Diagnostics.Debug.WriteLine("====================Setting END===================");return Content(jsonstr);}

6、DEMO实例下载

下载地址

本文标签: aspnet mvc 项目使用Quartznet添加定时任务