using wms.dto.request.hj;
using wms.dto;
using Quartz;
using Quartz.Impl;
using Quartz.Impl.Matchers;
using Quartz.Impl.Triggers;
namespace wms.api.Job
{
///
/// 任务调度器
///
public class JobScheduler
{
public static IScheduler InitScheduler()
{
//创建调度器工厂
ISchedulerFactory factory = new StdSchedulerFactory();
//创建调度器对象
IScheduler scheduler = factory.GetScheduler().Result;
////创建任务
//IJobDetail job = JobBuilder.Create().Build();
////创建触发器
//ITrigger trigger = TriggerBuilder.Create().WithIdentity("TimeTrigger", "TimeGroup").WithSimpleSchedule(p => p.WithIntervalInMinutes(1).RepeatForever()).Build();
////任务、触发器添至调度器对象
//scheduler.ScheduleJob(job, trigger);
//scheduler.Start();
return scheduler;
}
public static void Start(string jobName, Type jobType, string timeCorn)
{
var sched = InitScheduler();
var jobList = GetJobList(Const.JobGroupName).Result;
var job = jobList.Where(p => jobName == p.JobName);
if (job.Count() > 0)
{
//if (job.First().JobStatus == "Stop")
{
sched.DeleteJob(new JobKey(jobName, Const.JobGroupName));
StartJob(jobName, jobType, timeCorn);
}
//else
//{
// ResumeAsync(jobName, Const.JobGroupName);
//}
}
else
{
StartJob(jobName, jobType, timeCorn);
}
}
public static async Task> GetJobList(string jobGroup)
{
var result = new List();
try
{
var group = await InitScheduler().GetJobGroupNames();
var currentlyExecutingJobs = await InitScheduler().GetCurrentlyExecutingJobs();
var matcher = GroupMatcher.GroupEquals(jobGroup);
var jobs = await InitScheduler().GetJobKeys(matcher);
foreach (var item in jobs)
{
var triggers = await InitScheduler().GetTriggersOfJob(item);
var state = await InitScheduler().GetTriggerState(triggers.First().Key);
var job = InitScheduler().GetJobDetail(item).Result;
result.Add(new SysJobDto()
{
JobName = job.Key.Name,
JobDesc = job.Description,
JobStatus = state.ToString(),
JobGroup = job.Key.Group
});
}
return result;
}
catch (Exception ex)
{ return result; }
}
public static void StartJob(string jobName, Type jobType, string timeCorn)
{
var scheduler = InitScheduler(); //获取对象
//创建任务
JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.Name = jobName;
jobDetail.JobType = jobType;
jobDetail.Group = Const.JobGroupName;
//创建触发器
CronTriggerImpl trigger = new CronTriggerImpl();
trigger.Name = jobName;
trigger.Group = Const.TiggerGroupName;
trigger.CronExpressionString = timeCorn;
//任务、触发器添至调度器对象
scheduler.ScheduleJob(jobDetail, trigger);
if (!scheduler.IsShutdown)
{
scheduler.Start();
}
}
}
}