Quartz.net基于数据库的任务调度管理(Only.Jobs)
一 前言:
各大調度組件優缺點在這就不討論了,使用Quartz.net是因為它可以執行秒級任務。
Only.Jobs 項目通過將各Job存儲在數據庫中,啟動一個專門的Job管理任務來循環調度各Job的的調度情況。
?
項目分為 Web管理系統 ?、服務運行端 ? 、數據提供邏輯處理層?
數據訪問使用了?SqlSugar?4.1.1.5版本,目前支持MySql、SqlServer
采用Quartz.net+Topshelf ?可安裝為windows服務。?
二 項目結構:
一一介紹下:
Only.Jobs.Items 下是創建的測試Job項目。
Only.Jobs ?是一個調度服務項目,集成了Topshelf,可安裝成windows服務。
Only.Jobs.Core ?是項目的核心層,對外提供數據操作。
Only.Jobs.Web 為調度任務的管理和狀態監控管理系統。
先來看下總體效果吧
運行Only.Jobs.Web項目:
?
?
在任務管理模塊可停止、啟用各Job.
?
三 表結構介紹
BackgroundJob ?為任務信息存儲表
BackgroundJobLog 為任務執行跟蹤日志表?
四 實現介紹
通過任務管理模塊將開發好的Job所在的項目配置起來,存儲到BackgroundJob表中。
在Only.Jobs項目中創建ManagerJob 類,Job調度任務管理。
[DisallowConcurrentExecution]
? ? public class ManagerJob : IJob
? ? {
? ? ? ? private readonly ILog _logger = LogManager.GetLogger(typeof(ManagerJob));
? ? ? ? public void Execute(IJobExecutionContext context)
? ? ? ? {
? ? ? ? ? ? Version Ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
? ? ? ? ? ? _logger.InfoFormat("ManagerJob Execute begin Ver." + Ver.ToString());
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? new QuartzManager().JobScheduler(context.Scheduler);
? ? ? ? ? ? ? ? _logger.InfoFormat("ManagerJob Executing ...");
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? JobExecutionException e2 = new JobExecutionException(ex);
? ? ? ? ? ? ? ? e2.RefireImmediately = true;
? ? ? ? ? ? }
? ? ? ? ? ? finally
? ? ? ? ? ? {
? ? ? ? ? ? ? ? _logger.InfoFormat("ManagerJob Execute end ");
? ? ? ? ? ? }
? ? ? ? }
? ? }
JobScheduler 方法:
/// <summary>
? ? ? ? /// Job狀態管控
? ? ? ? /// </summary>
? ? ? ? /// <param name="Scheduler"></param>
? ? ? ? public void JobScheduler(IScheduler Scheduler)
? ? ? ? {
? ? ? ? ? ? List<BackgroundJobInfo> list = new BackgroundJobService().GeAllowScheduleJobInfoList();
? ? ? ? ? ? if (list != null && list.Count > 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? foreach (BackgroundJobInfo jobInfo in list)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? JobKey jobKey = new JobKey(jobInfo.BackgroundJobId.ToString(), jobInfo.BackgroundJobId.ToString() + "Group");
? ? ? ? ? ? ? ? ? ? if (Scheduler.CheckExists(jobKey) == false)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if (jobInfo.State == 1 || jobInfo.State == 3)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ScheduleJob(Scheduler, jobInfo);
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (Scheduler.CheckExists(jobKey) == false)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 0);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 1);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else if (jobInfo.State == 5)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 0);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if (jobInfo.State == 5)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? Scheduler.DeleteJob(jobKey);
? ? ? ? ? ? ? ? ? ? ? ? ? ? new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 0);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else if (jobInfo.State == 3)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 1);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
其他的簡單的就不在這描述了。
接下來看下運行效果:
啟動Only.Jobs項目
??
僅僅是一個工具項目而已,大家可盡管仍磚頭過來。代碼已上傳github https://github.com/mamingbo/Only.Jobs ?歡迎下載使用。
相關文章:
基于Quartz.net 的開源任務管理平臺
使用sqlserver搭建高可用雙機熱備的Quartz集群部署【附源碼】
開源任務管理平臺TaskManager介紹
原文地址:http://www.cnblogs.com/mamingbo/p/7142057.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的Quartz.net基于数据库的任务调度管理(Only.Jobs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: REST参考手册
- 下一篇: Visual Studio Code: