鄂尔多斯-招源科技

QuartzWorker.cs 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. 
  2. using Quartz;
  3. using Quartz.Impl;
  4. using Quartz.Impl.Triggers;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.Specialized;
  8. using System.Linq;
  9. using System.Text;
  10. namespace CallCenter.QuartzService
  11. {
  12. public class QuartzWorker
  13. {
  14. public Log log = LogFactory.GetLogger("定时");
  15. public QuartzWorker()
  16. {
  17. }
  18. /// <summary>
  19. /// 初始化IScheduler
  20. /// </summary>
  21. /// <returns></returns>
  22. public IScheduler GetScheduler()
  23. {
  24. IScheduler _scheduler = null;
  25. try
  26. {
  27. var properties = new NameValueCollection();
  28. //properties["quartz.scheduler.instanceName"] = "RemoteServerSchedulerClient";
  29. // 设置线程池
  30. properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
  31. properties["quartz.threadPool.threadCount"] = "10";
  32. properties["quartz.threadPool.threadPriority"] = "Normal";
  33. // 远程输出配置
  34. properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
  35. properties["quartz.scheduler.exporter.port"] = "556";
  36. properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
  37. properties["quartz.scheduler.exporter.channelType"] = "tcp";
  38. var schedulerFactory = new StdSchedulerFactory(properties);
  39. _scheduler = schedulerFactory.GetScheduler();
  40. }
  41. catch (Exception ex)
  42. {
  43. log.Info("QuartzWorker初始化失败,失败原因:" + ex.ToString());
  44. }
  45. return _scheduler;
  46. }
  47. /// <summary>
  48. /// 添加一个任务
  49. /// </summary>
  50. /// <param name="job"></param>
  51. public bool AddWork(QuartzJob job, IScheduler _scheduler)
  52. {
  53. var type = job.GetType();
  54. var jobName = "job_" + job.jobID;
  55. var jobGroup = "group_" + job.jobID;
  56. bool bl = false;
  57. try
  58. {
  59. JobKey jk = new JobKey(jobName, jobGroup);
  60. if (_scheduler.GetJobDetail(jk) == null)
  61. {
  62. // 创建一个工作
  63. var jobDetail = new JobDetailImpl(jobName, jobGroup, type, true, true);
  64. // 创建一个触发器
  65. Quartz.Collection.HashSet<ITrigger> triggerSet = new Quartz.Collection.HashSet<ITrigger>();
  66. var cronExpressionList = job.CronExpressionList;
  67. for (int i = 0; i < cronExpressionList.Count; i++)
  68. {
  69. var triggerName = "trigger_" + job.jobID + "_" + (i + 1);
  70. //触发器名称必须不同,否则最终只会添加一个触发器
  71. triggerSet.Add(new CronTriggerImpl(triggerName, jobGroup, jobName, jobGroup, cronExpressionList[i]));
  72. log.Info(triggerName + "已新增,规则:" + cronExpressionList[i]);
  73. }
  74. _scheduler.ScheduleJob(jobDetail, triggerSet, false);
  75. //启动任务
  76. if (!_scheduler.IsStarted)
  77. {
  78. Start(_scheduler);
  79. }
  80. else
  81. {
  82. _scheduler.ResumeJob(jk);
  83. }
  84. log.Info("启动任务:" + jobName);
  85. }
  86. else
  87. {
  88. Update(job, _scheduler);
  89. }
  90. bl = true;
  91. }
  92. catch (Exception ex)
  93. {
  94. log.Info("添加任务失败,失败原因:" + ex.ToString());
  95. }
  96. return bl;
  97. }
  98. /// <summary>
  99. /// 开始运行
  100. /// </summary>
  101. public void Start(IScheduler _scheduler)
  102. {
  103. _scheduler.Start();
  104. log.Info("QuartzWorker已启动");
  105. }
  106. /// <summary>
  107. /// 停止运行
  108. /// </summary>
  109. public void Stop(IScheduler _scheduler)
  110. {
  111. _scheduler.Shutdown(true);
  112. log.Info("QuartzWorker已停止");
  113. }
  114. /// <summary>
  115. /// 暂停所有定时任务
  116. /// </summary>
  117. public void PauseAll(IScheduler _scheduler)
  118. {
  119. _scheduler.PauseAll();
  120. log.Info("暂停所有定时任务");
  121. }
  122. /// <summary>
  123. /// 重新启动所有定时任务
  124. /// </summary>
  125. public void ResumeAll(IScheduler _scheduler)
  126. {
  127. _scheduler.ResumeAll();
  128. log.Info("重新启动所有定时任务");
  129. }
  130. /// <summary>
  131. /// 修改任务触发器
  132. /// </summary>
  133. public void Update(QuartzJob job, IScheduler _scheduler)
  134. {
  135. var jobName = "job_" + job.jobID;
  136. var jobGroup = "group_" + job.jobID;
  137. try
  138. {
  139. var cronExpressionList = job.CronExpressionList;
  140. JobKey jk = new JobKey(jobName, jobGroup);
  141. List<ITrigger> list = _scheduler.GetTriggersOfJob(jk).ToList();
  142. for (int i = 0; i < list.Count; i++)
  143. {
  144. TriggerKey tk = list[i].Key;
  145. _scheduler.PauseTrigger(tk);
  146. _scheduler.UnscheduleJob(tk);
  147. }
  148. Quartz.Collection.HashSet<ITrigger> triggerSet = new Quartz.Collection.HashSet<ITrigger>();
  149. for (int i = 0; i < cronExpressionList.Count; i++)
  150. {
  151. var triggerName = "trigger_" + job.jobID + "_" + (i + 1);
  152. var trigger = new CronTriggerImpl(triggerName, jobGroup, jobName, jobGroup, cronExpressionList[i]);
  153. triggerSet.Add(trigger);
  154. log.Info(triggerName + "已修改,规则:" + cronExpressionList[i]);
  155. }
  156. _scheduler.ScheduleJob(_scheduler.GetJobDetail(jk), triggerSet, true);
  157. }
  158. catch (Exception ex)
  159. {
  160. log.Info(jobName + "修改失败,原因:" + ex.ToString());
  161. }
  162. }
  163. /// <summary>
  164. /// 移除任务
  165. /// </summary>
  166. public void Delete(QuartzJob job, IScheduler _scheduler)
  167. {
  168. var jobName = "job_" + job.jobID;
  169. var jobGroup = "group_" + job.jobID;
  170. try
  171. {
  172. JobKey jk = new JobKey(jobName, jobGroup);
  173. foreach (var tri in _scheduler.GetTriggersOfJob(jk))
  174. {
  175. _scheduler.PauseTrigger(tri.Key);
  176. _scheduler.UnscheduleJob(tri.Key);
  177. }
  178. _scheduler.DeleteJob(jk);
  179. log.Info(jobName + "已移除");
  180. }
  181. catch (Exception ex)
  182. {
  183. log.Info(jobName + "移除失败,原因:" + ex.ToString());
  184. }
  185. }
  186. }
  187. }