You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

395 lines
16 KiB

  1. using Quartz;
  2. using Quartz.Impl;
  3. using Quartz.Impl.Triggers;
  4. using System;
  5. using System.Collections.Generic;
  6. using Learun.Util;
  7. namespace Learun.Application.Extention.TaskScheduling
  8. {
  9. /// <summary>
  10. /// 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架
  11. /// Copyright (c) 2013-2018 上海力软信息技术有限公司
  12. /// 创 建:超级管理员
  13. /// 日 期:2019-01-09 16:07
  14. /// 描 述:任务调度操作类
  15. /// </summary>
  16. public class QuartzHelper
  17. {
  18. private static ISchedulerFactory schedFact = new StdSchedulerFactory();//构建一个调度工厂
  19. #region 新增任务
  20. /// <summary>
  21. /// 添加只执行一次的任务
  22. /// </summary>
  23. /// <param name="jobName">任务名称</param>
  24. /// <param name="starTime">任务开始时间</param>
  25. /// <param name="endTime">任务结束时间</param>
  26. /// <param name="keyValue">任务主键</param>
  27. public static void AddRepeatOneJob(string jobName, string starTime, string endTime, string keyValue)
  28. {
  29. try
  30. {
  31. IScheduler sched = schedFact.GetScheduler(); //得到一个调度程序
  32. IJobDetail job = JobBuilder.Create<SchedulingHelper>()//新建任务执行类
  33. .WithIdentity(jobName, "lrts") // name "myJob", group "group1"
  34. .UsingJobData("keyValue", keyValue)//传递参数
  35. .Build();
  36. ///开始时间处理
  37. DateTime StarTime = DateTime.Now;
  38. if (!string.IsNullOrEmpty(starTime))
  39. {
  40. StarTime = Convert.ToDateTime(starTime);
  41. }
  42. DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(StarTime, 1);
  43. ///结束时间处理
  44. DateTime EndTime =DateTime.Now;
  45. if (!string.IsNullOrEmpty(endTime))
  46. {
  47. EndTime = Convert.ToDateTime(endTime);
  48. }
  49. DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(EndTime, 1);
  50. // 创建一个时间触发器
  51. SimpleTriggerImpl trigger = new SimpleTriggerImpl();
  52. trigger.Name = jobName;
  53. trigger.Group = "lrts";
  54. trigger.StartTimeUtc = starRunTime;
  55. trigger.EndTimeUtc = endRunTime;
  56. trigger.RepeatCount = 0;
  57. sched.ScheduleJob(job, trigger);
  58. // 启动
  59. if (!sched.IsStarted)
  60. {
  61. sched.Start();
  62. }
  63. }
  64. catch (Exception e)
  65. {
  66. throw (e);
  67. }
  68. }
  69. /// <summary>
  70. /// 添加简单重复执行任务
  71. /// </summary>
  72. /// <param name="jobName">任务名称</param>
  73. /// <param name="starTime">开始时间</param>
  74. /// <param name="endTime">结束时间</param>
  75. /// <param name="keyValue">任务主键</param>
  76. /// <param name="value">间隔值</param>
  77. /// <param name="type">间隔类型</param>
  78. public static void AddRepeatJob(string jobName, string starTime, string endTime, string keyValue, int value, string type)
  79. {
  80. try
  81. {
  82. IScheduler sched = schedFact.GetScheduler(); //得到一个调度程序
  83. IJobDetail job = JobBuilder.Create<SchedulingHelper>()//新建任务执行类
  84. .WithIdentity(jobName, "lrts") // name "myJob", group "group1"
  85. .UsingJobData("keyValue", keyValue)//传递参数
  86. .Build();
  87. ///开始时间处理
  88. DateTime StarTime = DateTime.Now;
  89. if (!string.IsNullOrEmpty(starTime))
  90. {
  91. StarTime = Convert.ToDateTime(starTime);
  92. }
  93. DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(StarTime, 1);
  94. ///结束时间处理
  95. DateTime EndTime = DateTime.MaxValue.AddDays(-1);
  96. if (!string.IsNullOrEmpty(endTime))
  97. {
  98. EndTime = Convert.ToDateTime(endTime);
  99. }
  100. DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(EndTime, 1);
  101. ITrigger trigger = null;
  102. switch (type) {
  103. case "minute": // 分钟
  104. trigger = TriggerBuilder.Create().WithIdentity(jobName, "lrts")
  105. .StartAt(starRunTime)
  106. .EndAt(endRunTime)
  107. .WithSimpleSchedule(t =>
  108. t.WithIntervalInMinutes(value)
  109. .RepeatForever())
  110. .Build();
  111. break;
  112. case "hours": // 小时
  113. trigger = TriggerBuilder.Create()
  114. .WithIdentity(jobName, "lrts")
  115. .StartAt(starRunTime)
  116. .EndAt(endRunTime)
  117. .WithSimpleSchedule(t =>
  118. t.WithIntervalInHours(value)
  119. .RepeatForever())
  120. .Build();
  121. break;
  122. case "day": // 天
  123. trigger = TriggerBuilder.Create()
  124. .WithIdentity(jobName, "lrts")
  125. .StartAt(starRunTime)
  126. .EndAt(endRunTime)
  127. .WithSchedule(
  128. CalendarIntervalScheduleBuilder.Create()
  129. .WithIntervalInDays(value)
  130. )
  131. .Build();
  132. break;
  133. case "week":// 周
  134. trigger = TriggerBuilder.Create()
  135. .WithIdentity(jobName, "lrts")
  136. .StartAt(starRunTime)
  137. .EndAt(endRunTime)
  138. .WithSchedule(
  139. CalendarIntervalScheduleBuilder.Create()
  140. .WithIntervalInWeeks(value)
  141. )
  142. .Build();
  143. break;
  144. }
  145. //实例化
  146. sched.ScheduleJob(job, trigger);
  147. //启动
  148. if (!sched.IsStarted)
  149. {
  150. sched.Start();
  151. }
  152. }
  153. catch (Exception e)
  154. {
  155. throw (e);
  156. }
  157. }
  158. /// <summary>
  159. /// 添加Cron表达式任务(一个表达式)
  160. /// </summary>
  161. /// <param name="jobName">任务名称</param>
  162. /// <param name="starTime">开始时间</param>
  163. /// <param name="endTime">结束时间</param>
  164. /// <param name="keyValue">主键名称</param>
  165. /// <param name="corn">Cron表达式</param>
  166. public static void AddCronJob(string jobName, string starTime, string endTime, string keyValue, string corn)
  167. {
  168. try
  169. {
  170. IScheduler sched = schedFact.GetScheduler(); //得到一个调度程序
  171. IJobDetail job = JobBuilder.Create<SchedulingHelper>()//新建任务执行类
  172. .WithIdentity(jobName, "lrts") // name "myJob", group "group1"
  173. .UsingJobData("keyValue", keyValue)//传递参数
  174. .Build();
  175. ///开始时间处理
  176. DateTime StarTime = DateTime.Now;
  177. if (!string.IsNullOrEmpty(starTime))
  178. {
  179. StarTime = Convert.ToDateTime(starTime);
  180. }
  181. DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(StarTime, 1);
  182. ///结束时间处理
  183. DateTime EndTime = DateTime.MaxValue.AddDays(-1);
  184. if (!string.IsNullOrEmpty(endTime))
  185. {
  186. EndTime = Convert.ToDateTime(endTime);
  187. }
  188. DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(EndTime, 1);
  189. // 创建一个时间触发器
  190. ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
  191. .StartAt(starRunTime)
  192. .EndAt(endRunTime)
  193. .WithIdentity(jobName, "lrts")
  194. .WithCronSchedule(corn)
  195. .Build();
  196. sched.ScheduleJob(job, trigger);
  197. // 启动
  198. if (!sched.IsStarted)
  199. {
  200. sched.Start();
  201. }
  202. }
  203. catch (Exception e)
  204. {
  205. throw (e);
  206. }
  207. }
  208. /// <summary>
  209. /// 添加多触发器任务
  210. /// </summary>
  211. /// <param name="jobName">任务名称</param>
  212. /// <param name="jobGroupName">任务组名称</param>
  213. /// <param name="starTime">开始时间</param>
  214. /// <param name="endTime">结束时间</param>
  215. /// <param name="keyValue">任务主键</param>
  216. /// <param name="list">cron数组</param>
  217. public static void AddListCronJob(string jobName, string starTime, string endTime, string keyValue, List<string> list)
  218. {
  219. try
  220. {
  221. IScheduler sched = schedFact.GetScheduler(); //得到一个调度程序
  222. IJobDetail job = JobBuilder.Create<SchedulingHelper>()//新建任务执行类
  223. .WithIdentity(jobName, "lrts") // name "myJob", group "group1"
  224. .UsingJobData("keyValue", keyValue)//传递参数
  225. .StoreDurably()
  226. .Build();
  227. ///开始时间处理
  228. DateTime StarTime = DateTime.Now;
  229. if (!string.IsNullOrEmpty(starTime))
  230. {
  231. StarTime = Convert.ToDateTime(starTime);
  232. }
  233. DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(StarTime, 1);
  234. ///结束时间处理
  235. DateTime EndTime = DateTime.MaxValue.AddDays(-1);
  236. if (!string.IsNullOrEmpty(endTime))
  237. {
  238. EndTime = Convert.ToDateTime(endTime);
  239. }
  240. DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(EndTime, 1);
  241. sched.AddJob(job, true);
  242. // 创建一个时间触发器
  243. for (var i = 0; i < list.Count; i++)
  244. {
  245. ITrigger trigger = TriggerBuilder.Create()
  246. .WithIdentity("trigger" + Guid.NewGuid().ToString())
  247. .StartAt(starRunTime)
  248. .EndAt(endRunTime)
  249. .ForJob(job)
  250. .WithCronSchedule(list[i])
  251. .Build();
  252. sched.ScheduleJob(trigger);
  253. }
  254. // 启动
  255. if (!sched.IsStarted)
  256. {
  257. sched.Start();
  258. }
  259. }
  260. catch (Exception e)
  261. {
  262. throw (e);
  263. }
  264. }
  265. #endregion
  266. #region 删除任务
  267. /// <summary>
  268. /// 删除任务
  269. /// </summary>
  270. /// <param name="jobName">任务名称</param>
  271. public static void DeleteJob(string jobName)
  272. {
  273. IScheduler sched = schedFact.GetScheduler();
  274. TriggerKey triggerKey = new TriggerKey(jobName, "lrts");
  275. sched.PauseTrigger(triggerKey);// 停止触发器
  276. sched.UnscheduleJob(triggerKey);// 移除触发器
  277. sched.DeleteJob(JobKey.Create(jobName, "lrts"));// 删除任务
  278. }
  279. #endregion
  280. #region 任务暂停和启动
  281. /// <summary>
  282. /// 暂停一个job任务
  283. /// </summary>
  284. /// <param name="jobName">任务名称</param>
  285. public static void PauseJob(string jobName)
  286. {
  287. if (!string.IsNullOrEmpty(jobName))
  288. {
  289. IScheduler sched = schedFact.GetScheduler(); //得到一个调度程序
  290. sched.PauseJob(JobKey.Create(jobName, "lrts"));
  291. }
  292. }
  293. /// <summary>
  294. /// 重启启动一个job
  295. /// </summary>
  296. /// <param name="jobName">任务名称</param>
  297. public static void ResumeJob(string jobName)
  298. {
  299. if (!string.IsNullOrEmpty(jobName))
  300. {
  301. IScheduler sched = schedFact.GetScheduler(); //得到一个调度程序
  302. sched.ResumeJob(JobKey.Create(jobName, "lrts"));
  303. }
  304. }
  305. #endregion
  306. #region 扩展应用
  307. /// <summary>
  308. /// 添加任务
  309. /// </summary>
  310. /// <param name="schemeInfoId">模板信息主键</param>
  311. /// <param name="processId">任务进程主键</param>
  312. /// <param name="scheme">任务模板</param>
  313. public static void AddJob(string schemeInfoId, string processId,TSSchemeModel scheme)
  314. {
  315. string startTime = "";
  316. string endTime = "";
  317. if (scheme.startType == 2 && scheme.startTime != null) {
  318. startTime = ((DateTime)scheme.startTime).ToString("yyyy-MM-dd hh:mm:ss");
  319. }
  320. if (scheme.endType == 2 && scheme.endTime != null)
  321. {
  322. endTime = ((DateTime)scheme.endTime).ToString("yyyy-MM-dd hh:mm:ss");
  323. }
  324. switch (scheme.executeType) {
  325. case 1:// 只执行一次
  326. AddRepeatOneJob(schemeInfoId, startTime, endTime, processId);//加入只执行一次的任务
  327. break;
  328. case 2:// 简单重复执行
  329. AddRepeatJob(schemeInfoId, startTime, endTime, processId, scheme.simpleValue, scheme.simpleType);
  330. break;
  331. case 3:// 明细频率执行
  332. List<string> cornlist = new List<string>();
  333. foreach (var fre in scheme.frequencyList)
  334. {
  335. string cron = "0 ";
  336. cron += fre.minute + " " + fre.hour + " ";
  337. switch (fre.type) {
  338. case "day":
  339. cron += "* ";
  340. break;
  341. case "week":
  342. cron += "? ";
  343. break;
  344. case "month":
  345. cron += fre.carryDate + " ";
  346. break;
  347. }
  348. cron += fre.carryMounth + " ";
  349. if (fre.type == "week")
  350. {
  351. cron += fre.carryDate + " ";
  352. }
  353. else
  354. {
  355. cron += "? ";
  356. }
  357. cron += "*";
  358. cornlist.Add(cron);
  359. }
  360. AddListCronJob(schemeInfoId, startTime, endTime, processId, cornlist);
  361. break;
  362. case 4:// corn表达式
  363. AddCronJob(schemeInfoId, startTime, endTime, processId, scheme.cornValue);
  364. break;
  365. }
  366. }
  367. public static void InitJob() {
  368. TSProcessIBLL tSProcessIBLL = new TSProcessBLL();
  369. TSSchemeIBLL tSSchemeIBLL = new TSSchemeBLL();
  370. IEnumerable<TSProcessEntity> list = tSProcessIBLL.GetList();
  371. foreach (var item in list) {
  372. var schemeEntity = tSSchemeIBLL.GetSchemeEntity(item.F_SchemeId);
  373. AddJob(item.F_SchemeInfoId, item.F_Id, schemeEntity.F_Scheme.ToObject<TSSchemeModel>());
  374. }
  375. }
  376. #endregion
  377. }
  378. }