Quartz.net定时任务的使用及获取正在运行的JOB

定时任务管理类

实现了如下功能:

1、对定时任务进行管理 2、创建定时任务,需要给定时任务一个job的名称 3、判断给定的job的任务是否已存在 4、停止定时任务的功能

  1. namespace MyUKD.Quartz

  2. {

  3. public class QuartzSchedulerMgr

  4. {

  5. private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();

  6. private static ISchedulerFactory schedulerFactory;

  7. private static IScheduler scheduler;

  8. /// <summary>

  9. /// 初始化处理

  10. /// </summary>

  11. public static async void Initialize()

  12. {

  13. NameValueCollection props = new NameValueCollection

  14. {

  15. {"quartz.serializer.type","binary" }

  16. };

  17. LogProvider.IsDisabled = true;

  18. schedulerFactory = new StdSchedulerFactory(props);

  19. scheduler = await schedulerFactory.GetScheduler();

  20. await scheduler.Start();

  21. }

  22. public static async void UnInitialize()

  23. {

  24. await scheduler.PauseAll();

  25. //var groups = await scheduler.GetJobGroupNames();

  26. foreach (string g in await scheduler.GetJobGroupNames())

  27. {

  28. await scheduler.DeleteJobs(await scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(g)));

  29. await scheduler.UnscheduleJobs(await scheduler.GetTriggerKeys(GroupMatcher<TriggerKey>.GroupEquals(g)));

  30. }

  31. }

  32. public static IScheduler GetScheduler()

  33. {

  34. return scheduler;

  35. }

  36. /// <summary>

  37. ///

  38. /// </summary>

  39. /// <param name="jobName"></param>

  40. /// <returns></returns>

  41. public static async Task<bool> UnScheduleJob(string jobName)

  42. {

  43. try

  44. {

  45. bool exist = await ExistJob(jobName);

  46. if (exist)

  47. {

  48. JobKey key = JobKey.Create(jobName, $"{jobName}-JobGroup");

  49. TriggerKey triggerKey = new TriggerKey(jobName, $"{jobName}-TriggerGroup");

  50. await scheduler.PauseJob(key);

  51. bool unScheduleJob = await scheduler.UnscheduleJob(triggerKey);

  52. bool delete = await scheduler.DeleteJob(key);

  53. System.Diagnostics.Debug.WriteLine($"UnScheduleJob:JobKey:{key.Group}-{key.Name},TriggerKey:{triggerKey.Group}-{triggerKey.Name}");

  54. return unScheduleJob && delete;

  55. }

  56. }

  57. catch (Exception e)

  58. {

  59. System.Diagnostics.Debug.WriteLine(e);

  60. Logger.Error(e);

  61. }

  62. return true;

  63. }

  64. /// <summary>

  65. ///

  66. /// </summary>

  67. /// <param name="jobName"></param>

  68. /// <returns></returns>

  69. public static async Task<bool> ExistJob(string jobName)

  70. {

  71. JobKey key = JobKey.Create(jobName, $"{jobName}-JobGroup");

  72. return await scheduler.CheckExists(key);

  73. }

  74. /// <summary>

  75. /// 创建定时任务:确定执行间隔,确定执行次数的任务

  76. /// </summary>

  77. /// <typeparam name="T">继承IJob的类</typeparam>

  78. /// <param name="jobName">任务的名称</param>

  79. /// <param name="intervalInSeconds">多长时间执行一次</param>

  80. /// <param name="repeatCount">重复执行次数</param>

  81. /// <returns></returns>

  82. public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds, int repeatCount) where T : IJob

  83. {

  84. IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").Build();

  85. ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup")

  86. .WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).WithRepeatCount(repeatCount))

  87. .Build();

  88. return await scheduler.ScheduleJob(job, trigger);

  89. }

  90. /// <summary>

  91. /// 创建定时任务:确定执行间隔,确定执行次数的任务

  92. /// </summary>

  93. /// <typeparam name="T">继承IJob的类</typeparam>

  94. /// <param name="jobName">任务的名称</param>

  95. /// <param name="intervalInSeconds">多长时间执行一次</param>

  96. /// <param name="repeatCount">重复执行次数</param>

  97. /// <param name="dataMap">向任务传递的参数</param>

  98. /// <returns></returns>

  99. public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds, int repeatCount, JobDataMap dataMap)

  100. where T : IJob

  101. {

  102. IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").UsingJobData(dataMap).Build();

  103. ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup").StartNow()

  104. .WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).WithRepeatCount(repeatCount))

  105. .Build();

  106. return await scheduler.ScheduleJob(job, trigger);

  107. }

  108. /// <summary>

  109. /// 创建定时任务:确定执行间隔,一直执行

  110. /// </summary>

  111. /// <typeparam name="T">继承IJob的类</typeparam>

  112. /// <param name="jobName">任务的名称</param>

  113. /// <param name="intervalInSeconds">多长时间执行一次</param>

  114. /// <returns></returns>

  115. public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds) where T : IJob

  116. {

  117. IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").Build();

  118. ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup").StartNow()

  119. .WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).RepeatForever())

  120. .Build();

  121. System.Diagnostics.Debug.WriteLine($"CreateJob:{job.Description}-{trigger.Description}");

  122. //Console.WriteLine($"CreateJob:{job.Description}-{trigger.Description}");

  123. return await scheduler.ScheduleJob(job, trigger);

  124. }

  125. /// <summary>

  126. /// 创建定时任务:确定执行间隔,一直执行

  127. /// </summary>

  128. /// <typeparam name="T">继承IJob的类</typeparam>

  129. /// <param name="jobName">任务的名称</param>

  130. /// <param name="intervalInSeconds">多长时间执行一次</param>

  131. /// <param name="dataMap">向任务传递的参数</param>

  132. /// <returns></returns>

  133. public static async Task<DateTimeOffset> CreateJob<T>(string jobName, int intervalInSeconds, JobDataMap dataMap)

  134. where T : IJob

  135. {

  136. IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").UsingJobData(dataMap).Build();

  137. ITrigger trigger = TriggerBuilder.Create().WithIdentity(jobName, $"{jobName}-TriggerGroup").StartNow()

  138. .WithSimpleSchedule(x => x.WithIntervalInSeconds(intervalInSeconds).RepeatForever())

  139. .Build();

  140. return await scheduler.ScheduleJob(job, trigger);

  141. }

  142. /// <summary>

  143. /// 创建任务,根据cron表达式确定任务执行的工作

  144. /// </summary>

  145. /// <typeparam name="T">继承IJob的类</typeparam>

  146. /// <param name="jobName">任务的名称</param>

  147. /// <param name="cronTime">cron表达式</param>

  148. /// <returns></returns>

  149. public static async Task<DateTimeOffset> CreateJob<T>(string jobName, string cronTime) where T : IJob

  150. {

  151. IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").Build();

  152. ICronTrigger trigger = new CronTriggerImpl(jobName, $"{jobName}-TriggerGroup", cronTime);

  153. return await scheduler.ScheduleJob(job, trigger);

  154. }

  155. /// <summary>

  156. /// 创建任务,根据cron表达式确定任务执行的工作

  157. /// </summary>

  158. /// <typeparam name="T">继承IJob的类</typeparam>

  159. /// <param name="jobName">任务的名称</param>

  160. /// <param name="cronTime">cron表达式</param>

  161. /// <param name="dataMap">向任务传递的参数</param>

  162. /// <returns></returns>

  163. public static async Task<DateTimeOffset> CreateJob<T>(string jobName, string cronTime, JobDataMap dataMap) where T : IJob

  164. {

  165. IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, $"{jobName}-JobGroup").UsingJobData(dataMap).Build();

  166. ICronTrigger trigger = new CronTriggerImpl(jobName, $"{jobName}-TriggerGroup", cronTime);

  167. return await scheduler.ScheduleJob(job, trigger);

  168. }

  169. }

  170. }

定时任务获取正在执行的JOB

1、首先获取Scheduler

  1. var scheduler = QuartzSchedulerMgr.GetScheduler()

2、获取Scheduler中的JobGroupNames

  1. var groups = scheduler.GetJobGroupNames();

3、for循环逐个对每个group进行处理,可以获取到job的名称信息,以及触发器trigger的下次执行时间等内容

  1. foreach (var groupName in groups)

  2. {

  3. foreach (var jobKey in QuartzSchedulerMgr.GetScheduler().GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)))

  4. {

  5. string jobName = jobKey.Name;

  6. string jobGroup = jobKey.Group;

  7. var triggers = QuartzSchedulerMgr.GetScheduler().GetTriggersOfJob(jobKey);

  8. foreach (ITrigger trigger in triggers)

  9. {

  10. trigger.GetNextFireTimeUtc();

  11. }

  12. }

  13. }


注:下次触发时间为UTC时间,我们这边是北京时间,需要进行转换

  1. TimeZone.CurrentTimeZone.ToLocalTime(Convert.ToDateTime(triggers.ToList()[0].GetNextFireTimeUtc().ToString()))

·END·

DotNetCore学习站

超乎想象的.NET Core学习资源

微信号:DotNetCore学习站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫谈认证与授权

漫谈认证与授权Intro认证与授权一直以来都是很多人在讨论的话题&#xff0c;之所以想这次谈一谈认证和授权&#xff0c;主要是因为最近看到许多文章都把认证和授权混为一谈&#xff0c;把认证方式当作是授权方式。所以想写篇文章谈谈我眼中的认证与授权。Authentication什么是认…

【译】gRPC vs HTTP APIs

本文翻译自 ASP.NET Blog | gRPC vs HTTP APIs&#xff0c;作者 James&#xff0c;译者 Edison Zhou。现在&#xff0c;ASP.NET Core使开发人员可以构建gRPC服务。gRPC是一个远程过程调用框架&#xff0c;专注于高性能和开发人员的生产力。ASP.NET Core 3.0中集成了gRPC&#x…

.NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控

由于分布式应用是由多个组件组成的&#xff0c;且这些组件往往是由不同的团队拥有和操作&#xff0c;所以在与应用程序发生交互时&#xff0c;就会需要跨多个组件执行代码的分布式跟踪。如果用户遇到了问题&#xff0c;想要确定是哪个组件出现了差错&#xff0c;基本就是一件不…

【翻译】.NET Core3.1发布

.NET Core3.1发布我们很高兴宣布.NET Core 3.1的发布。实际上&#xff0c;这只是对我们两个多月前发布的.NET Core 3.0的一小部分修复和完善。最重要的是.NET Core 3.1是长期支持&#xff08;LTS&#xff09;版本&#xff0c;并且将支持三年。和过去一样&#xff0c;我们希望花…

JVM(1)——JVM内存分区

一、JVM简介 JVM&#xff0c;即Java虚拟机&#xff08;Java Virtual Machine&#xff09;&#xff0c;一种能够运行Java bytecode的虚拟机&#xff0c;是Java实现跨平台的基础。 引入Java语言虚拟机后&#xff0c;Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚…

使用Azure Pipelines从GitHub发布NuGet包

[本文目录]ps: 阅读本文大概需要20分钟欢迎大家点击上方公众号链接关注我&#xff0c;了解新西兰码农生活什么是 YAML?name/value 名称/值collections 集合multiple data types 复合数据类型comments 注释Pipelines 的 YAML 结构在 Azure DevOps Pipelines 中创建第一个任务为…

JVM(2)——JVM类加载机制

一、JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 在Java语言里面&#xff0c;类型的加载和连接过程都是在程序运…

PYPL 12月榜单发布,编程语言、IDE与数据库市场如何?

PYPL&#xff08;PopularitY of Programming Language&#xff0c;编程语言流行指数&#xff09;12 月份的榜单已经发布了。PYPL 是非常流行的参考指标&#xff0c;其榜单数据的排名均是根据榜单对象在 Google 上相关的搜索频率进行统计排名&#xff0c;原始数据来自 Google Tr…

JVM(3)——JVM类加载器

一、类加载器简介 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器虽然只用于实现类的…

.NET Core应用框架AA介绍(二)

AA的开源地址https://github.com/ChengLab/AAFrameWork AA框架是一个基础应用框架&#xff0c;是建立在众多大家熟知的流行工具之上并与之集成。比如&#xff1a;ASP.NET Core、Automapper、Dapper、Dapper-FluentMap、RabbitMQ、Redis、MassTransit、Log4net等等大家可以很方便…

JVM(4)——对象访问

一、对象创建过程在Java语言中&#xff0c;对象是如何访问的呢&#xff1f;对象访问在Java语言中无处不在&#xff0c;是最普通的程序行为&#xff0c;但即使是最简单的访问&#xff0c;也会涉及Java虚拟机栈、Java堆区、方法区。 对于下面这行代码&#xff0c; Object obj ne…

鹅厂后台开发工程师的工作日常

写在前面 &#xff1a;本故事纯属虚构&#xff0c;如有雷同&#xff0c;不负责任。为了整理 Linux 开发和日常使用的常用命令&#xff0c;想了好几天才串了这么个故事。虽然有点牵强&#xff0c;但是内容还是挺干的~欢迎大家点评。在很久很久以前&#xff0c;鹅厂开发类工程师职…

.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏...

经过一段时间的努力&#xff0c;iNeuDA产品组件已经开发和测试完成&#xff0c;现在正式上线。现在iNeuOS工业互联网操作系统的技术体系和产品体系更佳完善&#xff0c;为中小企业提供更佳全面解决方案。如下图&#xff1a;iNeuDA 一站式大数据分析平台作为国内领先的新一代自助…

asp.net core 从 3.0 到 3.1

asp.net core 从 3.0 到 3.1Intro今天 .net core 3.1 正式发布了&#xff0c;.net core 3.1 正式版已发布&#xff0c;3.1 主要是对 3.0 的 bug 修复&#xff0c;以及一些小优化&#xff0c;而且作为 LTS 版本&#xff0c;建议大家升级。值得一提的是.net core 2.2 这个月就要寿…

身边的设计模式(三):抽象工厂 与 依赖注入

上篇文章&#xff0c;我们说到了简单工厂和工厂方法&#xff0c;如果没看过的&#xff0c;请先看上篇&#xff0c;不然的话&#xff0c;可能有些吃力&#xff0c;或者直接点击阅读原文&#xff0c;查看我博客园的对应详细版的文章。大家学到了这里&#xff0c;我建议自己可以练…

Java基础知识——Java集合详解

数组是Java很常见的一种数据结构&#xff0c;能够快速地进行存取。但是当遇到下面几种情况&#xff1a; ①我们需要存储的数据集数目是不定的 ②我们希望数据集能够自动排序 ③我们需要以键值对的方式存储数据 … 数组就不能满足我们的需求了。这时候&#xff0c;我们就需要使用…

边缘计算与云计算的不同,这篇说明白了!

术语“边缘计算”是指一种分布式计算&#xff0c;是将数据存储和计算带到需要它的站点或设备附近&#xff0c;这种分配设置消除了滞后时间并节省了带宽。与“物联网”相比&#xff0c;这是一种针对云环境的优化方法。它在数据源附近&#xff08;即网络的“边缘”&#xff09;处…

经典排序算法(12)——总结

一、排序算法简介 排序算法&#xff08;Sorting algorithm&#xff09;是一种能将一串数据&#xff0c;依照特定排序方式&#xff08;依照其中的某个或某些关键字的大小&#xff09;进行排列的一种算法。 常见的排序算法有&#xff1a;交换排序&#xff08;冒泡排序、快速排序&…

在Asp.Net Core MVC 开发过程中遇到的问题总结

1. Q: Razor视图中怎么添加全局模型验证消息A&#xff1a;使用ModelOnly<div asp-validation-summary"ModelOnly" class"text-danger"></div>2.Q&#xff1a;树形表格&#xff0c;使用的是bootstrap-tablejquery.treegridA&#xff1a;效果参考…

为什么子线程中不能直接更新UI

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约4000字&#xff0c;预计阅读时间8分钟当初有同事就碰到类似的问题&#xff0c;于是就总结了一些&#xff0c;那时写这篇文章是我还在第一家公司。今天有人提到…