欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

實現Quartz.NET的HTTP作業調度

freeflydom
2024年9月7日 11:10 本文熱度 935

Quartz.NET作為一個開源的作業調度庫,廣泛應用于.NET應用程序中,以實現復雜的定時任務,本次記錄利用Quartz.NET實現HTTP作業調度,通過自定義HTTP作業,實現對外部API的定時調用和如何管理這些作業,包括創建、修改、暫停、恢復和刪除作業。

public class HttpJob : IJob

{

    public static readonly Dictionary<string, HttpJobInfo> Delegates = new();


    public async Task Execute(IJobExecutionContext context)

    {

        var delegateKey = context.JobDetail.JobDataMap.GetString("delegateKey");

        if (delegateKey != null && Delegates.TryGetValue(delegateKey, out var func))

        {

            var requestBody = new RestRequest();

            if (func.Headers != null)

            {

                foreach (var header in func.Headers)

                {

                    requestBody.AddHeader(header.Key, header.Value);

                }

            }


            var content = HttpHelper.HttpRequest(func.Url, func.Request, requestBody);

            JobLogHelper.AddJobLog(new JobLog() { JobName = context.JobDetail.Key.Name, GroupName = context.JobDetail.Key.Group, RunTime = DateTime.Now, RunResult = content });

            UpdateLastExecutionTime(context.JobDetail.Key.Name, context.JobDetail.Key.Group, DateTime.Now);

        }

        await Task.CompletedTask;

    }

}


2.作業信息的持久化:為了持久化作業信息,定義了JobInfo類來存儲作業的基本信息,如名稱、組名、Cron表達式等,并將這些信息保存在本地的JSON文件中。


public class JobInfo

{

    public required string JobName { get; set; }

    public required string GroupName { get; set; }

    public required string CronExpression { get; set; }

    public DateTime LastExecutionTime { get; set; }

    public JobStatus Status { get; set; }

    public required HttpJobInfo HttpJob { get; set; }

}


3.實現了QuartzHelper類,用于管理作業的生命周期。這包括加載作業信息、創建作業、調度作業、暫停/恢復作業以及刪除作業等功能。


public class QuartzHelper

 {

     private IScheduler scheduler;

     private List<JobInfo> jobInfos;


     private string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "jobs.json");


     /// <summary>

     /// 構造函數,初始化定時任務管理器

     /// </summary>

     public QuartzHelper()

     {

         ISchedulerFactory schedulerFactory = new StdSchedulerFactory();

         scheduler = schedulerFactory.GetScheduler().Result;

         scheduler.Start().Wait();

         LoadJobInfosApi().Wait();


     }

     /// <summary>

     /// 保存作業信息到本地 JSON 文件

     /// </summary>

     private void SaveJobInfos()

     {

         string json = JsonConvert.SerializeObject(jobInfos);

         File.WriteAllText(filePath, json);

     }


     /// <summary>

     /// 加載本地 JSON 文件中的作業信息

     /// </summary>

     private async Task LoadJobInfosApi()

     {

         if (File.Exists(filePath))

         {

             string json = File.ReadAllText(filePath);

             jobInfos = JsonConvert.DeserializeObject<List<JobInfo>>(json) ?? new List<JobInfo>();

             foreach (var jobInfo in jobInfos)

             {

                

                 // 創建委托的唯一鍵

                 var delegateKey = Guid.NewGuid().ToString();

                 // 將委托存儲在靜態字典中

                 HttpJob.Delegates[delegateKey] = jobInfo.HttpJob;


                 // 創建并調度作業

                 IJobDetail job = JobBuilder.Create<HttpJob>()

                     .WithIdentity(jobInfo.JobName, jobInfo.GroupName).UsingJobData("delegateKey", delegateKey) // 將委托的鍵添加到JobDataMap

                     .Build();


                 ITrigger trigger = TriggerBuilder.Create()

                     .WithIdentity(jobInfo.JobName, jobInfo.GroupName)

                     .WithCronSchedule(jobInfo.CronExpression)

                     //.StartNow()

                     .Build();


                 await scheduler.ScheduleJob(job, trigger);


                 // 根據任務狀態恢復或暫停任務

                 if (jobInfo.Status == JobStatus.正常運行)

                 {

                     await ResumeJob(jobInfo.JobName, jobInfo.GroupName);

                 }

                 else

                 {

                     await PauseJob(jobInfo.JobName, jobInfo.GroupName);

                 }

             }

         }

         else

         {

             jobInfos = new List<JobInfo>();

         }

     }




     #region 執行普通任務時使用,傳委托時可以參考此方法

     ///// <summary>

     ///// 新建任務并立即執行

     ///// </summary>

     //[Obsolete("執行普通任務時使用,可以傳委托使用")]

     //public async Task AddJob(string jobName, string groupName, string cronExpression, Func<bool> func, string description = "")

     //{

     //    if (jobInfos.Any(c => c.JobName == jobName && c.GroupName == groupName))

     //    {

     //        return;

     //    }


     //    // 創建委托的唯一鍵

     //    var delegateKey = Guid.NewGuid().ToString();

     //    // 將委托存儲在靜態字典中

     //   // MyJobClass.Delegates[delegateKey] = func;


     //    // 創建作業信息并保存到列表  需要將func 加入到jobInfo 中做作業持久化!!!!

     //    var jobInfo = new JobInfo { JobName = jobName, GroupName = groupName, CronExpression = cronExpression, Status = JobStatus.正常運行, Description = description, JobCreateTime = DateTime.Now };

     //    jobInfos.Add(jobInfo);

     //    SaveJobInfos();


     //    // 創建Quartz作業和觸發器

     //    IJobDetail job = JobBuilder.Create<MyJobClass>()

     //        .WithIdentity(jobName, groupName)

     //        .UsingJobData("delegateKey", delegateKey) // 將委托的鍵添加到JobDataMap

     //        .Build();


     //    ITrigger trigger = TriggerBuilder.Create()

     //        .WithIdentity(jobName + "Trigger", groupName)

     //        .StartNow()

     //        .WithCronSchedule(cronExpression).WithDescription(description)

     //        .Build();


     //    await scheduler.ScheduleJob(job, trigger);


     //}


     #endregion


     /// <summary>

     /// 新建任務并立即執行

     /// </summary>       

   

     public async Task AddJobApi(string jobName, string groupName, string cronExpression, HttpJobInfo httpJobInfo, string description = "")

     {

         if (jobInfos.Any(c => c.JobName == jobName && c.GroupName == groupName))

         {

             return;

         }


         // 創建委托的唯一鍵

         var delegateKey = Guid.NewGuid().ToString();

         // 將委托存儲在靜態字典中

         HttpJob.Delegates[delegateKey] = httpJobInfo;


         // 創建作業信息并保存到列表  需要將func 加入到jobInfo 中做作業持久化!!!!

         var jobInfo = new JobInfo { JobName = jobName, GroupName = groupName, CronExpression = cronExpression, HttpJob = httpJobInfo, Status = JobStatus.正常運行, Description = description, JobCreateTime = DateTime.Now };

         jobInfos.Add(jobInfo);

         SaveJobInfos();


         // 創建Quartz作業和觸發器

         IJobDetail job = JobBuilder.Create<HttpJob>()

             .WithIdentity(jobName, groupName)

             .UsingJobData("delegateKey", delegateKey) // 將委托的鍵添加到JobDataMap

             .Build();


         ITrigger trigger = TriggerBuilder.Create()

             .WithIdentity(jobName + "Trigger", groupName)

             .StartNow()

             .WithCronSchedule(cronExpression).WithDescription(description)

             .Build();


         await scheduler.ScheduleJob(job, trigger);


     }



     /// <summary>

     /// 暫停任務

     /// </summary>

     public async Task PauseJob(string jobName, string groupName)

     {

         await scheduler.PauseJob(new JobKey(jobName, groupName));

         var job = jobInfos.FirstOrDefault(j => j.JobName == jobName && j.GroupName == groupName);

         if (job != null)

         {

             job.Status = JobStatus.暫停;

             SaveJobInfos();

         }

     }


     /// <summary>

     /// 開啟任務

     /// </summary>

     public async Task ResumeJob(string jobName, string groupName)

     {

         await scheduler.ResumeJob(new JobKey(jobName, groupName));

         var job = jobInfos.FirstOrDefault(j => j.JobName == jobName && j.GroupName == groupName);

         if (job != null)

         {

             job.Status = JobStatus.正常運行;

             SaveJobInfos();

         }

     }


     /// <summary>

     /// 立即執行任務

     /// </summary>

     public async Task TriggerJob(string jobName, string groupName)

     {

         await scheduler.TriggerJob(new JobKey(jobName, groupName));

         var job = jobInfos.FirstOrDefault(j => j.JobName == jobName && j.GroupName == groupName);

         if (job != null)

         {

             job.LastExecutionTime = DateTime.Now;

             SaveJobInfos();

         }

     }



     /// <summary>

     /// 修改任務

     /// </summary>

     public async Task ModifyJob(string jobName, string groupName, string cronExpression, HttpJobInfo httpJobInfo, string description = "")

     {

         await DeleteJob(jobName, groupName);

         await AddJobApi(jobName, groupName, cronExpression, httpJobInfo, description);

     }

     /// <summary>

     /// 刪除任務

     /// </summary>

     public async Task DeleteJob(string jobName, string groupName)

     {

         await scheduler.DeleteJob(new JobKey(jobName, groupName));

         jobInfos.RemoveAll(j => j.JobName == jobName && j.GroupName == groupName);

         SaveJobInfos();

     }


     /// <summary>

     /// 獲取當前所有任務列表

     /// </summary>

     public List<JobInfo> GetAllJobs()

     {

         if (File.Exists(filePath))

         {

             string json = File.ReadAllText(filePath);

             jobInfos = JsonConvert.DeserializeObject<List<JobInfo>>(json) ?? new List<JobInfo>();

             return jobInfos;

         }

         else

             return null;

         

     }



 }


QuartzHelper


4.為了跟蹤作業的執行情況,設計了JobLog類和JobLogHelper類,用于記錄和查詢作業執行日志。


public class JobLogHelper

{

    private static string _filePath;


    /// <summary>

    /// 根據作業名稱和組名稱獲取當日的作業執行日志

    /// </summary>

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

    /// <param name="groupName"></param>

    /// <returns></returns>

    public static List<JobLog> GetJobLog(string jobName, string groupName)

    {

        _filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"jobsLog-{DateTime.Now:yyyyMMdd}.json");


        // 檢查文件是否存在

        if (!File.Exists(_filePath))

        {

            return new List<JobLog>();

        }

        var jsonText = $"[{File.ReadAllText(_filePath)}]";

        var list = JsonConvert.DeserializeObject<List<JobLog>>(jsonText);

        if (list != null)

        {

            var result = list.Where(c => c.JobName == jobName && groupName == c.GroupName).OrderByDescending(c => c.RunTime).ToList();

            return result;

        }


        return null;

    }

    /// <summary>

    ///獲取所有的 作業執行日志  //可以從這里拓展其他查詢條件

    /// </summary>

    /// <returns></returns>

    public static List<JobLog> GetAllLogs()

    {

        List<JobLog> jobLogs = new List<JobLog>();

        var logFilePaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "jobsLog-*.json");

        logFilePaths.ToList().ForEach(c =>

        {

            var jsonText = $"[{File.ReadAllText(_filePath)}]";

            var list = JsonConvert.DeserializeObject<List<JobLog>>(jsonText);

            if (list != null) jobLogs.AddRange(list);

        });

        return jobLogs;

    }

    /// <summary>

    /// 添加作業執行日志

    /// </summary>

    /// <param name="jobLog"></param>

    public static void AddJobLog(JobLog jobLog)

    {

        _filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"jobsLog-{DateTime.Now:yyyyMMdd}.json");

        string json = JsonConvert.SerializeObject(jobLog) + ",\n";

        File.AppendAllText(_filePath, json);

    }

}


作業執行日志


5.最后,通過ASP.NET Core的Controller提供了一系列Web API接口,以便于通過HTTP請求管理作業。這些接口包括獲取作業列表、添加作業、修改作業、刪除作業、暫停作業、恢復作業和立即執行作業等。


[Route("api/[controller]")]

 [ApiController]

 public class QuartzController : ControllerBase

 {

     private readonly QuartzHelper _quartzHelper;

     public QuartzController(QuartzHelper quartzHelper)

     {

         _quartzHelper = quartzHelper;

     }


     [HttpGet]

     [Route("job/GetJobs")]

     public object GetJobs()

     {

         return Ok(new {code=200,data = _quartzHelper.GetAllJobs() });

     }


     [HttpGet]

     [Route("job/GetJobLog")]

     public object GetJobLog(string jobName, string groupName)

     {

         return Ok(new { code = 200, data = JobLogHelper.GetJobLog(jobName, groupName) });         

     }

     [HttpGet]

     [Route("job/GetJobLogs")]

     public object GetJobLogs()

     {

         return Ok(new { code = 200, data = JobLogHelper.GetAllLogs() });

     }



     [HttpPost]

     [Route("job/AddJob")]

     public async Task<object> Add(JobInfo jobInfo)

     {

         try

         {

             await _quartzHelper.AddJobApi(jobInfo.JobName, jobInfo.GroupName, jobInfo.CronExpression, jobInfo.HttpJob, jobInfo.Description);

             return Ok(new { code = 200, msg = "創建成功!" });

         }

         catch (Exception ex)

         {

             return Ok(new { code = 500, msg = ex.Message });

         }

     }


     [HttpPost]

     [Route("job/ModifyJob")]

     public async Task<object> Edit(JobInfo jobInfo)

     {

         try

         {

             await _quartzHelper.ModifyJob(jobInfo.JobName, jobInfo.GroupName, jobInfo.CronExpression, jobInfo.HttpJob, jobInfo.Description);

             return Ok(new { code = 200, msg = "修改成功!" });

         }

         catch (Exception ex)

         {

             return Ok(new { code = 500, msg = ex.Message });

         }

     }


     [HttpGet]

     [Route("job/DeleteJob")]

     public async Task<object> Delete(string jobName, string groupName)

     {

         try

         {

             await _quartzHelper.DeleteJob(jobName, groupName);

             return Ok(new { code = 200, msg = "刪除成功!" });

         }

         catch (Exception ex)

         {

             return Ok(new { code = 500, msg = ex.Message });

         }

     }


     [HttpGet]

     [Route("job/PauseJob")]

     public async Task<object> PauseJob(string jobName, string groupName)

     {

         try

         {

             await _quartzHelper.PauseJob(jobName, groupName);

             return Ok(new { code = 200, msg = "暫停成功!" });

         }

         catch (Exception ex)

         {

             return Ok(new { code = 500, msg = ex.Message });

         }

     }


     [HttpGet]

     [Route("job/ResumeJob")]

     public async Task<object> ResumeJob(string jobName, string groupName)

     {

         try

         {

             await _quartzHelper.ResumeJob(jobName, groupName);

             return Ok(new { code = 200, msg = "開啟任務成功!" });

         }

         catch (Exception ex)

         {

             return Ok(new { code = 500, msg = ex.Message });

         }

     }

     [HttpGet]

     [Route("job/TriggerJob")]

     public async Task<object> TriggerJob(string jobName, string groupName)

     {

         try

         {

             await _quartzHelper.TriggerJob(jobName, groupName);

             return Ok(new { code = 200, msg = "立即執行任務命令已執行!" });

         }

         catch (Exception ex)

         {

             return Ok(new { code = 500, msg = ex.Message });

         }

     }

 }


Web API接口

源碼地址:https://github.com/yycb1994/Quartz.Net

轉自:https://www.cnblogs.com/INetIMVC/p/18281699


該文章在 2024/9/7 11:10:58 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved