Quartz.net定时任务的使用及获取正在运行的JOB
定時任務管理類
實現了如下功能:
1、對定時任務進行管理 2、創建定時任務,需要給定時任務一個job的名稱 3、判斷給定的job的任務是否已存在 4、停止定時任務的功能
namespace MyUKD.Quartz
{
public class QuartzSchedulerMgr
{
private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
private static ISchedulerFactory schedulerFactory;
private static IScheduler scheduler;
/// <summary>
/// 初始化處理
/// </summary>
public static async void Initialize()
{
NameValueCollection props = new NameValueCollection
{
{"quartz.serializer.type","binary" }
};
LogProvider.IsDisabled = true;
schedulerFactory = new StdSchedulerFactory(props);
scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start();
}
public static async void UnInitialize()
{
await scheduler.PauseAll();
//var groups = await scheduler.GetJobGroupNames();
foreach (string g in await scheduler.GetJobGroupNames())
{
await scheduler.DeleteJobs(await scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(g)));
await scheduler.UnscheduleJobs(await scheduler.GetTriggerKeys(GroupMatcher<TriggerKey>.GroupEquals(g)));
}
}
public static IScheduler GetScheduler()
{
return scheduler;
}
/// <summary>
///
/// </summary>
/// <param name="jobName"></param>
/// <returns></returns>
public static async Task<bool> UnScheduleJob(string jobName)
{
try
{
bool exist = await ExistJob(jobName);
if (exist)
{
JobKey key = JobKey.Create(jobName, $"{jobName}-JobGroup");
TriggerKey triggerKey = new TriggerKey(jobName, $"{jobName}-TriggerGroup");
await scheduler.PauseJob(key);
bool unScheduleJob = await scheduler.UnscheduleJob(triggerKey);
bool delete = await scheduler.DeleteJob(key);
System.Diagnostics.Debug.WriteLine($"UnScheduleJob:JobKey:{key.Group}-{key.Name},TriggerKey:{triggerKey.Group}-{triggerKey.Name}");
return unScheduleJob && delete;
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e);
Logger.Error(e);
}
return true;
}
/// <summary>
///
/// </summary>
/// <param name="jobName"></param>
/// <returns></returns>
public static async Task<bool> ExistJob(string jobName)
{
JobKey key = JobKey.Create(jobName, $"{jobName}-JobGroup");
return await scheduler.CheckExists(key);
}
/// <summary>
/// 創建定時任務:確定執行間隔,確定執行次數的任務
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務的名稱</param>
/// <param name="intervalInSeconds">多長時間執行一次</param>
/// <param name="repeatCount">重復執行次數</param>
/// <returns></returns>
public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds, int repeatCount) where T : IJob
{
IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").Build();
ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).WithRepeatCount(repeatCount))
.Build();
return await scheduler.ScheduleJob(job, trigger);
}
/// <summary>
/// 創建定時任務:確定執行間隔,確定執行次數的任務
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務的名稱</param>
/// <param name="intervalInSeconds">多長時間執行一次</param>
/// <param name="repeatCount">重復執行次數</param>
/// <param name="dataMap">向任務傳遞的參數</param>
/// <returns></returns>
public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds, int repeatCount, JobDataMap dataMap)
where T : IJob
{
IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").UsingJobData(dataMap).Build();
ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup").StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).WithRepeatCount(repeatCount))
.Build();
return await scheduler.ScheduleJob(job, trigger);
}
/// <summary>
/// 創建定時任務:確定執行間隔,一直執行
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務的名稱</param>
/// <param name="intervalInSeconds">多長時間執行一次</param>
/// <returns></returns>
public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds) where T : IJob
{
IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").Build();
ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup").StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).RepeatForever())
.Build();
System.Diagnostics.Debug.WriteLine($"CreateJob:{job.Description}-{trigger.Description}");
//Console.WriteLine($"CreateJob:{job.Description}-{trigger.Description}");
return await scheduler.ScheduleJob(job, trigger);
}
/// <summary>
/// 創建定時任務:確定執行間隔,一直執行
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務的名稱</param>
/// <param name="intervalInSeconds">多長時間執行一次</param>
/// <param name="dataMap">向任務傳遞的參數</param>
/// <returns></returns>
public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds, JobDataMap dataMap)
where T : IJob
{
IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").UsingJobData(dataMap).Build();
ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup").StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).RepeatForever())
.Build();
return await scheduler.ScheduleJob(job, trigger);
}
/// <summary>
/// 創建任務,根據cron表達式確定任務執行的工作
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務的名稱</param>
/// <param name="cronTime">cron表達式</param>
/// <returns></returns>
public static async Task<DateTimeOffset> CreateJob<T>(string jobName, string cronTime) where T : IJob
{
IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").Build();
ICronTrigger trigger = new CronTriggerImpl(jobName, $"{jobName}-TriggerGroup", cronTime);
return await scheduler.ScheduleJob(job, trigger);
}
/// <summary>
/// 創建任務,根據cron表達式確定任務執行的工作
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務的名稱</param>
/// <param name="cronTime">cron表達式</param>
/// <param name="dataMap">向任務傳遞的參數</param>
/// <returns></returns>
public static async Task<DateTimeOffset> CreateJob<T>(string jobName, string cronTime, JobDataMap dataMap) where T : IJob
{
IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").UsingJobData(dataMap).Build();
ICronTrigger trigger = new CronTriggerImpl(jobName, $"{jobName}-TriggerGroup", cronTime);
return await scheduler.ScheduleJob(job, trigger);
}
}
}
定時任務獲取正在執行的JOB
1、首先獲取Scheduler
var scheduler = QuartzSchedulerMgr.GetScheduler()
2、獲取Scheduler中的JobGroupNames
var groups = scheduler.GetJobGroupNames();
3、for循環逐個對每個group進行處理,可以獲取到job的名稱信息,以及觸發器trigger的下次執行時間等內容
foreach (var groupName in groups)
{
foreach (var jobKey in QuartzSchedulerMgr.GetScheduler().GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)))
{
string jobName = jobKey.Name;
string jobGroup = jobKey.Group;
var triggers = QuartzSchedulerMgr.GetScheduler().GetTriggersOfJob(jobKey);
foreach (ITrigger trigger in triggers)
{
trigger.GetNextFireTimeUtc();
}
}
}
注:下次觸發時間為UTC時間,我們這邊是北京時間,需要進行轉換
TimeZone.CurrentTimeZone.ToLocalTime(Convert.ToDateTime(triggers.ToList()[0].GetNextFireTimeUtc().ToString()))
·END·
DotNetCore學習站
超乎想象的.NET Core學習資源
微信號:DotNetCore學習站總結
以上是生活随笔為你收集整理的Quartz.net定时任务的使用及获取正在运行的JOB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HttpClientFactory日志不
- 下一篇: 漫谈认证与授权