Quartz.net定时任务的使用及获取正在运行的JOB
定時(shí)任務(wù)管理類
實(shí)現(xiàn)了如下功能:
1、對(duì)定時(shí)任務(wù)進(jìn)行管理 2、創(chuàng)建定時(shí)任務(wù),需要給定時(shí)任務(wù)一個(gè)job的名稱 3、判斷給定的job的任務(wù)是否已存在 4、停止定時(shí)任務(wù)的功能
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>
/// 創(chuàng)建定時(shí)任務(wù):確定執(zhí)行間隔,確定執(zhí)行次數(shù)的任務(wù)
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務(wù)的名稱</param>
/// <param name="intervalInSeconds">多長時(shí)間執(zhí)行一次</param>
/// <param name="repeatCount">重復(fù)執(zhí)行次數(shù)</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>
/// 創(chuàng)建定時(shí)任務(wù):確定執(zhí)行間隔,確定執(zhí)行次數(shù)的任務(wù)
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務(wù)的名稱</param>
/// <param name="intervalInSeconds">多長時(shí)間執(zhí)行一次</param>
/// <param name="repeatCount">重復(fù)執(zhí)行次數(shù)</param>
/// <param name="dataMap">向任務(wù)傳遞的參數(shù)</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>
/// 創(chuàng)建定時(shí)任務(wù):確定執(zhí)行間隔,一直執(zhí)行
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務(wù)的名稱</param>
/// <param name="intervalInSeconds">多長時(shí)間執(zhí)行一次</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>
/// 創(chuàng)建定時(shí)任務(wù):確定執(zhí)行間隔,一直執(zhí)行
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務(wù)的名稱</param>
/// <param name="intervalInSeconds">多長時(shí)間執(zhí)行一次</param>
/// <param name="dataMap">向任務(wù)傳遞的參數(shù)</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>
/// 創(chuàng)建任務(wù),根據(jù)cron表達(dá)式確定任務(wù)執(zhí)行的工作
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務(wù)的名稱</param>
/// <param name="cronTime">cron表達(dá)式</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>
/// 創(chuàng)建任務(wù),根據(jù)cron表達(dá)式確定任務(wù)執(zhí)行的工作
/// </summary>
/// <typeparam name="T">繼承IJob的類</typeparam>
/// <param name="jobName">任務(wù)的名稱</param>
/// <param name="cronTime">cron表達(dá)式</param>
/// <param name="dataMap">向任務(wù)傳遞的參數(shù)</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);
}
}
}
定時(shí)任務(wù)獲取正在執(zhí)行的JOB
1、首先獲取Scheduler
var scheduler = QuartzSchedulerMgr.GetScheduler()
2、獲取Scheduler中的JobGroupNames
var groups = scheduler.GetJobGroupNames();
3、for循環(huán)逐個(gè)對(duì)每個(gè)group進(jìn)行處理,可以獲取到j(luò)ob的名稱信息,以及觸發(fā)器trigger的下次執(zhí)行時(shí)間等內(nèi)容
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();
}
}
}
注:下次觸發(fā)時(shí)間為UTC時(shí)間,我們這邊是北京時(shí)間,需要進(jìn)行轉(zhuǎn)換
TimeZone.CurrentTimeZone.ToLocalTime(Convert.ToDateTime(triggers.ToList()[0].GetNextFireTimeUtc().ToString()))
·END·
DotNetCore學(xué)習(xí)站
超乎想象的.NET Core學(xué)習(xí)資源
微信號(hào):DotNetCore學(xué)習(xí)站總結(jié)
以上是生活随笔為你收集整理的Quartz.net定时任务的使用及获取正在运行的JOB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HttpClientFactory日志不
- 下一篇: 漫谈认证与授权