1. 本文来自:http://www.cnblogs.com/pengze0902/p/6128558.html
  1. /// <summary>
  2. /// 任务处理帮助类
  3. /// </summary>
  4. public class QuartzHelper
  5. {
  6. public QuartzHelper() { }
  7.  
  8. public QuartzHelper(string quartzServer, string quartzPort)
  9. {
  10. Server = quartzServer;
  11. Port = quartzPort;
  12. }
  13.  
  14. /// <summary>
  15. /// 锁对象
  16. /// </summary>
  17. private static readonly object Obj = new object();
  18.  
  19. /// <summary>
  20. /// 方案
  21. /// </summary>
  22. private const string Scheme = "tcp";
  23.  
  24. /// <summary>
  25. /// 服务器的地址
  26. /// </summary>
  27. public static string Server { get; set; }
  28.  
  29. /// <summary>
  30. /// 服务器的端口
  31. /// </summary>
  32. public static string Port { get; set; }
  33.  
  34. /// <summary>
  35. /// 缓存任务所在程序集信息
  36. /// </summary>
  37. private static readonly Dictionary<string, Assembly> AssemblyDict = new Dictionary<string, Assembly>();
  38.  
  39. /// <summary>
  40. /// 程序调度
  41. /// </summary>
  42. private static IScheduler _scheduler;
  43.  
  44. /// <summary>
  45. /// 初始化任务调度对象
  46. /// </summary>
  47. public static void InitScheduler()
  48. {
  49. try
  50. {
  51. lock (Obj)
  52. {
  53. if (_scheduler != null) return;
  54. //配置文件的方式,配置quartz实例
  55. ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
  56. _scheduler = schedulerFactory.GetScheduler();
  57. }
  58. }
  59. catch (Exception ex)
  60. {
  61. throw new Exception(ex.Message);
  62. }
  63. }
  64.  
  65. /// <summary>
  66. /// 启用任务调度
  67. /// 启动调度时会把任务表中状态为“执行中”的任务加入到任务调度队列中
  68. /// </summary>
  69. public static void StartScheduler()
  70. {
  71. try
  72. {
  73. if (_scheduler.IsStarted) return;
  74. //添加全局监听
  75. _scheduler.ListenerManager.AddTriggerListener(new CustomTriggerListener(), GroupMatcher<TriggerKey>.AnyGroup());
  76. _scheduler.Start();
  77.  
  78. //获取所有执行中的任务
  79. List<TaskModel> listTask = TaskHelper.GetAllTaskList().ToList();
  80.  
  81. if (listTask.Count > )
  82. {
  83. foreach (TaskModel taskUtil in listTask)
  84. {
  85. try
  86. {
  87. ScheduleJob(taskUtil);
  88. }
  89. catch (Exception e)
  90. {
  91. throw new Exception(taskUtil.TaskName,e);
  92. }
  93. }
  94. }
  95. }
  96. catch (Exception ex)
  97. {
  98. throw new Exception(ex.Message);
  99. }
  100. }
  101.  
  102. /// <summary>
  103. /// 启用任务
  104. /// <param name="task">任务信息</param>
  105. /// <param name="isDeleteOldTask">是否删除原有任务</param>
  106. /// <returns>返回任务trigger</returns>
  107. /// </summary>
  108. public static void ScheduleJob(TaskModel task, bool isDeleteOldTask = false)
  109. {
  110. if (isDeleteOldTask)
  111. {
  112. //先删除现有已存在任务
  113. DeleteJob(task.TaskID.ToString());
  114. }
  115. //验证是否正确的Cron表达式
  116. if (ValidExpression(task.CronExpressionString))
  117. {
  118. IJobDetail job = new JobDetailImpl(task.TaskID.ToString(), GetClassInfo(task.AssemblyName, task.ClassName));
  119. //添加任务执行参数
  120. job.JobDataMap.Add("TaskParam", task.TaskParam);
  121.  
  122. CronTriggerImpl trigger = new CronTriggerImpl
  123. {
  124. CronExpressionString = task.CronExpressionString,
  125. Name = task.TaskID.ToString(),
  126. Description = task.TaskName
  127. };
  128. _scheduler.ScheduleJob(job, trigger);
  129. if (task.Status == TaskStatus.STOP)
  130. {
  131. JobKey jk = new JobKey(task.TaskID.ToString());
  132. _scheduler.PauseJob(jk);
  133. }
  134. else
  135. {
  136. List<DateTime> list = GetNextFireTime(task.CronExpressionString, );
  137. foreach (var time in list)
  138. {
  139. LogHelper.WriteLog(time.ToString(CultureInfo.InvariantCulture));
  140. }
  141. }
  142. }
  143. else
  144. {
  145. throw new Exception(task.CronExpressionString + "不是正确的Cron表达式,无法启动该任务!");
  146. }
  147. }
  148.  
  149. /// <summary>
  150. /// 初始化 远程Quartz服务器中的,各个Scheduler实例。
  151. /// 提供给远程管理端的后台,用户获取Scheduler实例的信息。
  152. /// </summary>
  153. public static void InitRemoteScheduler()
  154. {
  155. try
  156. {
  157. NameValueCollection properties = new NameValueCollection
  158. {
  159. ["quartz.scheduler.instanceName"] = "ExampleQuartzScheduler",
  160. ["quartz.scheduler.proxy"] = "true",
  161. ["quartz.scheduler.proxy.address"] =string.Format("{0}://{1}:{2}/QuartzScheduler", Scheme, Server, Port)
  162. };
  163.  
  164. ISchedulerFactory sf = new StdSchedulerFactory(properties);
  165.  
  166. _scheduler = sf.GetScheduler();
  167. }
  168. catch (Exception ex)
  169. {
  170. throw new Exception(ex.StackTrace);
  171. }
  172. }
  173.  
  174. /// <summary>
  175. /// 删除现有任务
  176. /// </summary>
  177. /// <param name="jobKey"></param>
  178. public static void DeleteJob(string jobKey)
  179. {
  180. try
  181. {
  182. JobKey jk = new JobKey(jobKey);
  183. if (_scheduler.CheckExists(jk))
  184. {
  185. //任务已经存在则删除
  186. _scheduler.DeleteJob(jk);
  187.  
  188. }
  189. }
  190. catch (Exception ex)
  191. {
  192. throw new Exception(ex.Message);
  193. }
  194. }
  195.  
  196. /// <summary>
  197. /// 暂停任务
  198. /// </summary>
  199. /// <param name="jobKey"></param>
  200. public static void PauseJob(string jobKey)
  201. {
  202. try
  203. {
  204. JobKey jk = new JobKey(jobKey);
  205. if (_scheduler.CheckExists(jk))
  206. {
  207. //任务已经存在则暂停任务
  208. _scheduler.PauseJob(jk);
  209. }
  210. }
  211. catch (Exception ex)
  212. {
  213. throw new Exception(ex.Message);
  214. }
  215. }
  216.  
  217. /// <summary>
  218. /// 恢复运行暂停的任务
  219. /// </summary>
  220. /// <param name="jobKey">任务key</param>
  221. public static void ResumeJob(string jobKey)
  222. {
  223. try
  224. {
  225. JobKey jk = new JobKey(jobKey);
  226. if (_scheduler.CheckExists(jk))
  227. {
  228. //任务已经存在则暂停任务
  229. _scheduler.ResumeJob(jk);
  230. }
  231. }
  232. catch (Exception ex)
  233. {
  234. throw new Exception(ex.Message);
  235. }
  236. }
  237.  
  238. /// <summary>
  239. /// 获取类的属性、方法
  240. /// </summary>
  241. /// <param name="assemblyName">程序集</param>
  242. /// <param name="className">类名</param>
  243. private static Type GetClassInfo(string assemblyName, string className)
  244. {
  245. try
  246. {
  247. assemblyName = FileHelper.GetAbsolutePath(assemblyName + ".dll");
  248. Assembly assembly = null;
  249. if (!AssemblyDict.TryGetValue(assemblyName, out assembly))
  250. {
  251. assembly = Assembly.LoadFrom(assemblyName);
  252. AssemblyDict[assemblyName] = assembly;
  253. }
  254. Type type = assembly.GetType(className, true, true);
  255. return type;
  256. }
  257. catch (Exception ex)
  258. {
  259. throw new Exception(ex.Message);
  260. }
  261. }
  262.  
  263. /// <summary>
  264. /// 停止任务调度
  265. /// </summary>
  266. public static void StopSchedule()
  267. {
  268. try
  269. {
  270. //判断调度是否已经关闭
  271. if (!_scheduler.IsShutdown)
  272. {
  273. //等待任务运行完成
  274. _scheduler.Shutdown(true);
  275. }
  276. }
  277. catch (Exception ex)
  278. {
  279. throw new Exception(ex.Message);
  280. }
  281. }
  282.  
  283. /// <summary>
  284. /// 校验字符串是否为正确的Cron表达式
  285. /// </summary>
  286. /// <param name="cronExpression">带校验表达式</param>
  287. /// <returns></returns>
  288. public static bool ValidExpression(string cronExpression)
  289. {
  290. return CronExpression.IsValidExpression(cronExpression);
  291. }
  292.  
  293. /// <summary>
  294. /// 获取任务在未来周期内哪些时间会运行
  295. /// </summary>
  296. /// <param name="CronExpressionString">Cron表达式</param>
  297. /// <param name="numTimes">运行次数</param>
  298. /// <returns>运行时间段</returns>
  299. public static List<DateTime> GetNextFireTime(string CronExpressionString, int numTimes)
  300. {
  301. if (numTimes < )
  302. {
  303. throw new Exception("参数numTimes值大于等于0");
  304. }
  305. //时间表达式
  306. ITrigger trigger = TriggerBuilder.Create().WithCronSchedule(CronExpressionString).Build();
  307. IList<DateTimeOffset> dates = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, numTimes);
  308. List<DateTime> list = new List<DateTime>();
  309. foreach (DateTimeOffset dtf in dates)
  310. {
  311. list.Add(TimeZoneInfo.ConvertTimeFromUtc(dtf.DateTime, TimeZoneInfo.Local));
  312. }
  313. return list;
  314. }
  315.  
  316. public static object CurrentTaskList()
  317. {
  318. throw new NotImplementedException();
  319. }
  320.  
  321. /// <summary>
  322. /// 获取当前执行的Task 对象
  323. /// </summary>
  324. /// <param name="context"></param>
  325. /// <returns></returns>
  326. public static TaskModel GetTaskDetail(IJobExecutionContext context)
  327. {
  328. TaskModel task = new TaskModel();
  329.  
  330. if (context != null)
  331. {
  332.  
  333. task.TaskID = Guid.Parse(context.Trigger.Key.Name);
  334. task.TaskName = context.Trigger.Description;
  335. task.RecentRunTime = DateTime.Now;
  336. task.TaskParam = context.JobDetail.JobDataMap.Get("TaskParam") != null ? context.JobDetail.JobDataMap.Get("TaskParam").ToString() : "";
  337. }
  338. return task;
  339. }
  340. }

[C#][Quartz]帮助类的更多相关文章

  1. Quartz管理类

    package com.sihuatech.project.task.manager; import java.text.ParseException; import org.quartz.CronT ...

  2. Quartz公共类,log4net 日志分目录 ,调度任务。

    版本:Quartz 2.5 ,log4net 2.0.8 QuartzHelper namespace Job.Common { public class QuartzHelper { private ...

  3. 定时器quartz工具类

    一.gradle配置 // https://mvnrepository.com/artifact/org.quartz-scheduler/quartz compile group: 'org.qua ...

  4. quartz测试类

    package demo.mytest; import java.text.ParseException; import org.quartz.CronTrigger;import org.quart ...

  5. 两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz

    1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportT ...

  6. Quartz:定时任务工具类

    Quartz:定时任务工具类 Quartz工具类 Quartz工具类 import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; ...

  7. Spring任务调度之Quartz

    一.Quartz作业类的继承方式来讲,可以分为两类: 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.Quart ...

  8. quartz与spring进行集成

    上一篇将了quartz框架的使用,spring同样也提供了对quartz的集成.这次就尝试一下在spring中集成quartz. 要在spring中使用job,Trigger和Scheduler,就要 ...

  9. Quartz 入门详解

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

随机推荐

  1. Chrome程序及数据位置变更到非系统盘

    Chrome浏览器在Windows系统上安装过程,没有设置安装位置的步骤,所以默认是安装在C盘的.并且,若Chrome作为主要浏览器使用,随着时间的积累,数据文件会非常多.增加系统盘的负荷. Wind ...

  2. spring mvc发送请求404,不能进入处理方法,也不报错

    找了很久找不到原因,那多半是字段绑定出错了.如字段不能为空的如int,double,没传给了空:字段是int的,给了double形式的值(1.0)..这些都会使spring mvc自动绑定出错,而且不 ...

  3. linux下寻找段错误的方法

    为了能够快速找到发生段错误的地方,记录以下两种方法. objdump和backtrace的配合使用 :https://www.cnblogs.com/jiangyibo/p/9507555.html ...

  4. Extend a root LVM partition online

    There is also a quick remedy for the emergency situation when your root partition runs out of disk s ...

  5. 简单webpack plugin 开发

    重要是学习下怎么开发webpack plugin,同时记录下 插件模型 webpack 是一个插件,可以是javascript class ,或者具名 class 定义apply 方法 指定一个绑定到 ...

  6. benthos v1 的一些新功能

    主要从视频文件截取,暂时github 上还没有很全的相关文档 v1目标 config lint processor error 处理 subprocess processor awk processo ...

  7. MySQL插入,更新,删除数据

    插入 单行插入 1.insert into 表名 values(col1_value,col2_value,...); 每个列必须提供一个值,如果没有值,要提供NULL值 每个列必须与它在表中定义的次 ...

  8. git merge 和 git merge --no-ff

    根据这张图片可以看出 git merge –no-ff 可以保存你之前的分支历史.能够更好的查看 merge历史,以及branch 状态. git merge 则不会显示 feature,只保留单条分 ...

  9. java-环境安装及配置

    需要安装的软件有: 1.Jdk1.8 2.Tomcat8 3.Eclipse Neon 4.Mysql 5.项目导入 1.JDK安装 1.1安装JDK 1.2配置环境变量 高级系统配置: 环境变量: ...

  10. mysql、MS SQL关于分页的sql查询语句 limit 和row_number() OVER函数

    在做项目的时候需要些分页,用的数据库是MySQL,之前看到的参考例子是用MS SQL做的,在MS SQL.Oracle里面有ROW_NUMBER() OVER函数可以在数据库里对数据进行分组.百度后的 ...