using Quartz;
using Quartz.Impl;
using Quartz.Impl.Triggers;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
namespace CallCenter.QuartzService
{
public class QuartzWorker
{
public Log log = LogFactory.GetLogger("定时");
public QuartzWorker()
{
}
///
/// 初始化IScheduler
///
///
public IScheduler GetScheduler()
{
IScheduler _scheduler = null;
try
{
var properties = new NameValueCollection();
//properties["quartz.scheduler.instanceName"] = "RemoteServerSchedulerClient";
// 设置线程池
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "10";
properties["quartz.threadPool.threadPriority"] = "Normal";
// 远程输出配置
properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
properties["quartz.scheduler.exporter.port"] = "556";
properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
properties["quartz.scheduler.exporter.channelType"] = "tcp";
var schedulerFactory = new StdSchedulerFactory(properties);
_scheduler = schedulerFactory.GetScheduler();
}
catch (Exception ex)
{
log.Info("QuartzWorker初始化失败,失败原因:" + ex.ToString());
}
return _scheduler;
}
///
/// 添加一个任务
///
///
public bool AddWork(QuartzJob job, IScheduler _scheduler)
{
var type = job.GetType();
var jobName = "job_" + job.jobID;
var jobGroup = "group_" + job.jobID;
bool bl = false;
try
{
JobKey jk = new JobKey(jobName, jobGroup);
if (_scheduler.GetJobDetail(jk) == null)
{
// 创建一个工作
var jobDetail = new JobDetailImpl(jobName, jobGroup, type, true, true);
// 创建一个触发器
Quartz.Collection.HashSet triggerSet = new Quartz.Collection.HashSet();
var cronExpressionList = job.CronExpressionList;
for (int i = 0; i < cronExpressionList.Count; i++)
{
var triggerName = "trigger_" + job.jobID + "_" + (i + 1);
//触发器名称必须不同,否则最终只会添加一个触发器
triggerSet.Add(new CronTriggerImpl(triggerName, jobGroup, jobName, jobGroup, cronExpressionList[i]));
log.Info(triggerName + "已新增,规则:" + cronExpressionList[i]);
}
_scheduler.ScheduleJob(jobDetail, triggerSet, false);
//启动任务
if (!_scheduler.IsStarted)
{
Start(_scheduler);
}
else
{
_scheduler.ResumeJob(jk);
}
log.Info("启动任务:" + jobName);
}
else
{
Update(job, _scheduler);
}
bl = true;
}
catch (Exception ex)
{
log.Info("添加任务失败,失败原因:" + ex.ToString());
}
return bl;
}
///
/// 开始运行
///
public void Start(IScheduler _scheduler)
{
_scheduler.Start();
log.Info("QuartzWorker已启动");
}
///
/// 停止运行
///
public void Stop(IScheduler _scheduler)
{
_scheduler.Shutdown(true);
log.Info("QuartzWorker已停止");
}
///
/// 暂停所有定时任务
///
public void PauseAll(IScheduler _scheduler)
{
_scheduler.PauseAll();
log.Info("暂停所有定时任务");
}
///
/// 重新启动所有定时任务
///
public void ResumeAll(IScheduler _scheduler)
{
_scheduler.ResumeAll();
log.Info("重新启动所有定时任务");
}
///
/// 修改任务触发器
///
public void Update(QuartzJob job, IScheduler _scheduler)
{
var jobName = "job_" + job.jobID;
var jobGroup = "group_" + job.jobID;
try
{
var cronExpressionList = job.CronExpressionList;
JobKey jk = new JobKey(jobName, jobGroup);
List list = _scheduler.GetTriggersOfJob(jk).ToList();
for (int i = 0; i < list.Count; i++)
{
TriggerKey tk = list[i].Key;
_scheduler.PauseTrigger(tk);
_scheduler.UnscheduleJob(tk);
}
Quartz.Collection.HashSet triggerSet = new Quartz.Collection.HashSet();
for (int i = 0; i < cronExpressionList.Count; i++)
{
var triggerName = "trigger_" + job.jobID + "_" + (i + 1);
var trigger = new CronTriggerImpl(triggerName, jobGroup, jobName, jobGroup, cronExpressionList[i]);
triggerSet.Add(trigger);
log.Info(triggerName + "已修改,规则:" + cronExpressionList[i]);
}
_scheduler.ScheduleJob(_scheduler.GetJobDetail(jk), triggerSet, true);
}
catch (Exception ex)
{
log.Info(jobName + "修改失败,原因:" + ex.ToString());
}
}
///
/// 移除任务
///
public void Delete(QuartzJob job, IScheduler _scheduler)
{
var jobName = "job_" + job.jobID;
var jobGroup = "group_" + job.jobID;
try
{
JobKey jk = new JobKey(jobName, jobGroup);
foreach (var tri in _scheduler.GetTriggersOfJob(jk))
{
_scheduler.PauseTrigger(tri.Key);
_scheduler.UnscheduleJob(tri.Key);
}
_scheduler.DeleteJob(jk);
log.Info(jobName + "已移除");
}
catch (Exception ex)
{
log.Info(jobName + "移除失败,原因:" + ex.ToString());
}
}
}
}