日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Asp.Net Core2.0 基于QuartzNet任务管理系统

發布時間:2023/12/4 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Asp.Net Core2.0 基于QuartzNet任务管理系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Quartz.NET官網地址:https://www.quartz-scheduler.net/

Quartz.NET文檔地址:https://www.quartz-scheduler.net/documentation/index.html

Quartz.NET是一個開源的作業調度框架,是OpenSymphony?的?Quartz API的.NET移植,它用C#寫成,可用于winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而創建簡單的或復雜的調度。它有很多特征,如:數據庫支持,集群,插件,支持cron-like表達式等等。

現在Quartz.NET3.0已支持Asp.Net Core,3.0新功能如下:

新功能

  • 具有異步/等待支持的基于任務的作業,內部以異步/等待方式工作

  • 支持.NET Core / netstandard 2.0和.NET Framework 4.5.2及更高版本

  • 通過提供程序名稱SQLite-Microsoft支持Microsoft.Data.Sqlite,舊的提供程序SQLite也仍然有效

  • 增加了SQL Server內存優化表和Quartz.Impl.AdoJobStore.UpdateLockRowSemaphoreMOT的初步支持

  • Common.Logging從相關性中刪除

  • 從ILMerge進程中刪除的C5集合不再需要

  • 在插件啟動時添加對作業調度XML文件的急切驗證的支持

  • 在TimeZoneUtil中添加對額外的自定義時區解析器功能的支持

變化

  • 作業和插件現在位于獨立的程序集NuGet包Quartz.Jobs和Quartz.Plugins中

  • ADO.NET提供者名稱已被簡化,提供者名稱沒有版本,例如SqlServer-20 => SqlServer

  • API方法已被重新使用,主要使用IReadOnlyCollection,這隱藏了兩個HashSets和List小號

  • LibLog一直隱藏于內部(ILog等),就像它原本打算的那樣

  • SimpleThreadPool消失了,舊的擁有的線程消失了

  • 調度程序方法已更改為基于任務,請記住等待它們

  • IJob接口現在返回一個任務

  • 一些IList屬性已更改為IReadOnlyList以正確反映意圖

  • SQL Server CE支持已被刪除

  • DailyCalendar現在將日期時間用于排除的日期,并具有ISet接口來訪問它們

  • IObjectSerializer有新的方法,void Initialize(),必須實現

  • IInterruptableJob取消了上下文的CancellationToken

Quartz API的關鍵接口和類是

  • IScheduler?- 與調度程序交互的主要API。

  • IJob?- 您希望由調度程序執行的組件實現的接口。

  • IJobDetail?- 用于定義作業的實例。

  • ITrigger?- 定義執行給定Job的時間表的組件。

  • JobBuilder?- 用于定義/構建定義作業實例的JobDetail實例。

  • TriggerBuilder?- 用于定義/構建觸發器實例

一、Quartz.NET基本使用

1、新建Asp.Net Core 項目,使用NuGet添加Quartz,或使用程序包管理器引用,命令如下:
Install-Package Quartz

?如果你想添加JSON序列化,只需要以同樣的方式添加Quartz.Serialization.Json包。

2、簡單實例,代碼如下:
using Five.QuartzNetJob.ExecuteJobTask.Service;using Quartz;using Quartz.Impl;using System;using System.Collections.Generic;using System.Collections.Specialized;using System.Text;using System.Threading.Tasks;namespace Five.QuartzNetJob.Web.Controllers { ? ?public class TestTask{ ? ? ? ?public async Task StartTestAsync() { ? ? ? ? ? ?try{ ? ? ? ? ? ? ? ?// 從工廠中獲取調度程序實例NameValueCollection props = new NameValueCollection{{ "quartz.serializer.type", "binary" }};StdSchedulerFactory factory = new StdSchedulerFactory(props);IScheduler scheduler = await factory.GetScheduler(); ? ? ? ? ? ? ? // 開啟調度器await scheduler.Start(); ? ? ? ? ? ? ? ?// 定義這個工作,并將其綁定到我們的IJob實現類IJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build(); ? ? ? ? ? ? ? ?// 觸發作業立即運行,然后每10秒重復一次,無限循環ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()).Build(); ? ? ? ? ? ? ? ?// 告訴Quartz使用我們的觸發器來安排作業await scheduler.ScheduleJob(job, trigger); ? ? ? ? ? ? ? ?// 等待60秒await Task.Delay(TimeSpan.FromSeconds(60)); ? ? ? ? ? ? ? ?// 關閉調度程序await scheduler.Shutdown();} ? ? ? ? ? ?catch (SchedulerException se){ ? ? ? ? ? ? ? ?await Console.Error.WriteLineAsync(se.ToString());}}} }

?HelloJob內容如下:

using Quartz;using System;using System.Collections.Generic;using System.Text;using System.Threading.Tasks;namespace Five.QuartzNetJob.ExecuteJobTask.Service { ? ?public class HelloJob : IJob{ ? ? ? ?public ?Task Execute(IJobExecutionContext context){Console.Out.WriteLineAsync("Greetings from HelloJob!"); ? ? ? ? ? ?return Task.CompletedTask;}} }

執行效果如下:

:Quartz的版本3.0.3中刪除了IJob實現的異地調用,也就是不支持async、await異步調用,3.0.2版本支持異步調用。

二、觸發器類型

?1、SimpleTrigger觸發器(簡單觸發器)

SimpleTrigger的屬性包括:開始時間和結束時間,重復計數和重復間隔。重復計數可以是零,一個正整數或常數值SimpleTrigger.RepeatIndefinitely。重復時間間隔屬性必須是TimeSpan.Zero或正的TimeSpan值。請注意,重復間隔為0會導致觸發器的“重復計數”觸發同時發生。

SimpleTrigger實例使用TriggerBuilder(用于觸發器的主屬性)和WithSimpleSchedule擴展方法(用于SimpleTrigger特定的屬性)構建。

在特定的時間內建立觸發器,無需重復,代碼如下:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartAt(DateTime.Now) //指定開始時間為當前系統時間.ForJob("job1", "group1") //通過JobKey識別作業.Build();

在特定的時間建立觸發器,然后每十秒鐘重復十次:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerITrigger trigger = trigger = TriggerBuilder.Create().WithIdentity("trigger2", "group2").StartAt(DateTime.Now) // 指定開始時間.WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(10)) // 請注意,重復10次將總共重復11次.ForJob("job2", "group2") //通過JobKey識別作業 ? ? ? ? ? ? ? ? ? .Build();

構建一個觸發器,將在未來五分鐘內觸發一次:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerITrigger trigger = trigger = (ISimpleTrigger)TriggerBuilder.Create().WithIdentity("trigger3", "group3").StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) //使用DateBuilder將來創建一個時間日期.ForJob("job3", "group3") //通過JobKey識別作業.Build();

建立一個現在立即觸發的觸發器,然后每隔五分鐘重復一次,直到22:00:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerITrigger trigger = trigger = TriggerBuilder.Create().WithIdentity("trigger4", "group4").WithSimpleSchedule(x => x.WithIntervalInMinutes(5)//每5秒執行一次 ? ? ? ?.RepeatForever()).EndAt(DateBuilder.DateOf(22, 0, 0))//晚上22點結束.Build();

建立一個觸發器,在一個小時后觸發,然后每2小時重復一次:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger5") // 由于未指定組,因此“trigger5”將位于默認分組中.StartAt(DateBuilder.EvenHourDate(null)) // 獲取下個一小時時間 ? ? ? ? ? ? ? ? .WithSimpleSchedule(x => x.WithIntervalInHours(2)//執行間隔2小時 ? ? ? ?.RepeatForever()).Build();?

因此簡單的任務調度使用SimpleTrigger完全夠用,如果SimpleTrigger還是不能滿足您的需求請往下看。

2、CronTrigger觸發器

如果你需要一個基于類似日歷的概念而不是精確指定的SimpleTrigger時間間隔的工作調度計劃,CronTriggers通常比SimpleTrigger更有用。

使用CronTrigger,您可以在每周一,周三的上午9點至上午10點之間指定開始時間表,例如“每星期五中午”或“每個工作日和上午9點30分”,或者“每5分鐘”和星期五”。

即使如此,就像SimpleTrigger一樣,CronTrigger有一個startTime,它指定了時間表的生效時間,還有一個(可選的)endTime,用于指定應該停止時間表的時間。

這里不在詳細介紹Cron。

Cron表達式在線生成器:http://cron.qqe2.com/

Cron表達式詳細介紹:https://www.jianshu.com/p/e9ce1a7e1ed1

每天早上8點到下午5點建立一個觸發器,每隔一分鐘就會觸發一次:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerITrigger trigger = TriggerBuilder.Create().WithIdentity("Job1", "group1").WithCronSchedule("0 0/2 8-17 * * ?")//使用Cron表達式.ForJob("Job1", "group1").Build();

建立一個觸發器,每天在上午10:42開始執行:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerITrigger trigger = TriggerBuilder.Create().WithIdentity("Job2", "group2").WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42)) // 在這里使用CronScheduleBuilder的靜態輔助方法.ForJob("Job2", "group2").Build();

構建一個觸發器,將在星期三上午10:42在除系統默認值之外的TimeZone中觸發:

// 觸發器構建器默認創建一個簡單的觸發器,實際上返回一個ITriggerITrigger trigger = TriggerBuilder.Create().WithIdentity("Job3", "group3").WithCronSchedule("0 42 10 ? * WED", x => x.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time"))).ForJob("Job3", "group3").Build();

總結:?Quartz.NET的3.0版本跟之前的版本api接口變化并不大。只是在3.0版本中添加了異步調用,并支持.net core。簡單的任務調度使用官網中的實例即可滿足需求。

三、后端項目管理

在網上找到很多關于asp.net 的任務管理,但沒有找到.net core 相關的后端任務管理。

我就根據官網還有網上dalao開源分享的項目實現了個簡單的后端任務。

這里也開源出來讓園區dalao批評指導。歡迎各位dalao留言批評!

項目地址:https://github.com/YANGKANG01/QuartzNetJob

項目結構

項目使用asp.net core 2.0--->adminlte-2.4.2-->SqlSugar-4.6.4.3。

數據庫表可使用SqlSugar來生成。

public IActionResult Index() { ? ?//生成表 ? ?//var db = DataHelper.GetInstance(); ? ?//db.CodeFirst.InitTables(typeof(OperateLog), typeof(OperateLog));return View();}

?

結構如下:

Five.QuartzNetJob.DataService.DataHelper----------------------------------是ORM層,使用的是開源框架SqlSugar(官網地址:http://www.codeisbug.com/Doc/8)

Five.QuartzNetJob.DataService.Models---------------------------------------是實體類

Five.QuartzNetJob.ExecuteJobTask.Service---------------------------------IJob實現層

QuartzNet.Entity---------------------------------------------------------------------調度中心相關實體類

QuartzNet2.Core--------------------------------------------------------------------非.Net Core版本的調度管理中心,使用的是.net framework 4.6

Five.QuartzNetJob.Utils.Tool-----------------------------------------------------通用工具類庫

Five.QuartzNetJob.Web-----------------------------------------------------------后端

項目很簡單,就只實現了增刪改查。

統一管理任務調度,項目運行時開啟任務調度并執行已開啟的任務。

因為項目太過于簡單,就不在詳細介紹。

下面貼出任務調度中心代碼,歡迎各位dalao發表意見:

using QuartzNet.Entity;using Quartz;using Quartz.Impl;using System;using System.Collections.Specialized;using System.Threading.Tasks;using Five.QuartzNetJob.Utils.Tool;using System.Reflection;using System.Collections.Generic;namespace QuartzNet3.Core { ? ?/// <summary>/// 任務調度中心 ? ?/// </summary>public class SchedulerCenter{ ? ? ? ?/// <summary>/// 任務調度對象 ? ? ? ?/// </summary>public static readonly SchedulerCenter Instance; ? ? ? ?static SchedulerCenter(){Instance = new SchedulerCenter();} ? ? ? ?private Task<IScheduler> _scheduler; ? ? ? ?/// <summary>/// 返回任務計劃(調度器) ? ? ? ?/// </summary>/// <returns></returns>private Task<IScheduler> Scheduler{ ? ? ? ? ? ?get{ ? ? ? ? ? ? ? ?if (this._scheduler != null){ ? ? ? ? ? ? ? ? ? ?return this._scheduler;} ? ? ? ? ? ? ? ?// 從Factory中獲取Scheduler實例NameValueCollection props = new NameValueCollection{{ "quartz.serializer.type", "binary" }, ? ? ? ? ? ? ? ? ? ?//以下配置需要數據庫表配合使用,表結構sql地址:https://github.com/quartznet/quartznet/tree/master/database/tables//{ "quartz.jobStore.type","Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"}, ? ? ? ? ? ? ? ? ? ?//{ "quartz.jobStore.driverDelegateType","Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz"}, ? ? ? ? ? ? ? ? ? ?//{ "quartz.jobStore.tablePrefix","QRTZ_"}, ? ? ? ? ? ? ? ? ? ?//{ "quartz.jobStore.dataSource","myDS"}, ? ? ? ? ? ? ? ? ? ?//{ "quartz.dataSource.myDS.connectionString",AppSettingHelper.MysqlConnection},//連接字符串 ? ? ? ? ? ? ? ? ? ?//{ "quartz.dataSource.myDS.provider","MySql"}, ? ? ? ? ? ? ? ? ? ?//{ "quartz.jobStore.useProperties","true"}};StdSchedulerFactory factory = new StdSchedulerFactory(props); ? ? ? ? ? ? ? ?return this._scheduler = factory.GetScheduler();}} ? ? ?/// <summary>/// 運行指定的計劃(映射處理IJob實現類) ? ? ? ?/// </summary>/// <param name="jobGroup">任務分組</param>/// <param name="jobName">任務名稱</param>/// <returns></returns>public async Task<BaseQuartzNetResult> RunScheduleJob<T>(string jobGroup, string jobName) where T : ScheduleManage{BaseQuartzNetResult result; ? ? ? ? ? ?//開啟調度器await this.Scheduler.Result.Start(); ? ? ? ? ? ?//創建指定泛型類型參數指定的類型實例T t = Activator.CreateInstance<T>(); ? ? ? ? ? ?//獲取任務實例ScheduleEntity scheduleModel = t.GetScheduleModel(jobGroup, jobName); ? ? ? ? ? ?//添加任務var addResult = AddScheduleJob(scheduleModel).Result; ? ? ? ? ? ?if (addResult.Code == 1000){scheduleModel.Status = EnumType.JobStatus.已啟用;t.UpdateScheduleStatus(scheduleModel); ? ? ? ? ? ? ? ?//用給定的密鑰恢復(取消暫停)IJobDetailawait this.Scheduler.Result.ResumeJob(new JobKey(jobName, jobGroup));result = new BaseQuartzNetResult{Code = 1000,Msg = "啟動成功"};} ? ? ? ? ? ?else{result = new BaseQuartzNetResult{Code = -1};} ? ? ? ? ? ?return result;} ? ? ? ?/// <summary>/// 添加一個工作調度(映射程序集指定IJob實現類) ? ? ? ?/// </summary>/// <param name="m"></param>/// <returns></returns>private async Task<BaseQuartzNetResult> AddScheduleJob(ScheduleEntity m){ ? ? ? ? ? ?var result = new BaseQuartzNetResult(); ? ? ? ? ? ?try{ ? ? ? ? ? ? ? ?//檢查任務是否已存在var jk = new JobKey(m.JobName, m.JobGroup); ? ? ? ? ? ? ? ?if (await this.Scheduler.Result.CheckExists(jk)){ ? ? ? ? ? ? ? ? ? ?//刪除已經存在任務await this.Scheduler.Result.DeleteJob(jk);} ? ? ? ? ? ? ? ?//反射獲取任務執行類var jobType = FileHelper.GetAbsolutePath(m.AssemblyName, m.AssemblyName + "." + m.ClassName); ? ? ? ? ? ? ? ?// 定義這個工作,并將其綁定到我們的IJob實現類IJobDetail job = new JobDetailImpl(m.JobName, m.JobGroup, jobType); ? ? ? ? ? ? ? ?//IJobDetail job = JobBuilder.CreateForAsync<T>().WithIdentity(m.JobName, m.JobGroup).Build(); ? ? ? ? ? ? ? ?// 創建觸發器 ? ? ? ? ? ? ? ?ITrigger trigger; ? ? ? ? ? ? ? ?//校驗是否正確的執行周期表達式if (!string.IsNullOrEmpty(m.Cron) && CronExpression.IsValidExpression(m.Cron)){trigger = CreateCronTrigger(m);} ? ? ? ? ? ? ? ?else{trigger = CreateSimpleTrigger(m);} ? ? ? ? ? ? ? ?// 告訴Quartz使用我們的觸發器來安排作業await this.Scheduler.Result.ScheduleJob(job, trigger);result.Code = 1000;} ? ? ? ? ? ?catch (Exception ex){ ? ? ? ? ? ? ? ?await Console.Out.WriteLineAsync(string.Format("添加任務出錯{0}", ex.Message));result.Code = 1001;result.Msg = ex.Message;} ? ? ? ? ? ?return result;} ? ? ? ?/// <summary>/// 運行指定的計劃(泛型指定IJob實現類) ? ? ? ?/// </summary>/// <param name="jobGroup">任務分組</param>/// <param name="jobName">任務名稱</param>/// <returns></returns>public async Task<BaseQuartzNetResult> RunScheduleJob<T, V>(string jobGroup, string jobName) where T : ScheduleManage, new() where V : IJob{BaseQuartzNetResult result; ? ? ? ? ? ?//開啟調度器await this.Scheduler.Result.Start(); ? ? ? ? ? ?//創建指定泛型類型參數指定的類型實例T t = Activator.CreateInstance<T>(); ? ? ? ? ? ?//獲取任務實例ScheduleEntity scheduleModel = t.GetScheduleModel(jobGroup, jobName); ? ? ? ? ? ?//添加任務var addResult = AddScheduleJob<V>(scheduleModel).Result; ? ? ? ? ? ?if (addResult.Code == 1000){scheduleModel.Status = EnumType.JobStatus.已啟用;t.UpdateScheduleStatus(scheduleModel); ? ? ? ? ? ? ? ?//用給定的密鑰恢復(取消暫停)IJobDetailawait this.Scheduler.Result.ResumeJob(new JobKey(jobName, jobGroup));result = new BaseQuartzNetResult{Code = 1000,Msg = "啟動成功"};} ? ? ? ? ? ?else{result = new BaseQuartzNetResult{Code = -1};} ? ? ? ? ? ?return result;} ? ? ? ?/// <summary>/// 添加任務調度(指定IJob實現類) ? ? ? ?/// </summary>/// <typeparam name="T"></typeparam>/// <param name="m"></param>/// <returns></returns>private async Task<BaseQuartzNetResult> AddScheduleJob<T>(ScheduleEntity m) where T : IJob{ ? ? ? ? ? ?var result = new BaseQuartzNetResult(); ? ? ? ? ? ?try{ ? ? ? ? ? ? ? ?//檢查任務是否已存在var jk = new JobKey(m.JobName, m.JobGroup); ? ? ? ? ? ? ? ?if (await this.Scheduler.Result.CheckExists(jk)){ ? ? ? ? ? ? ? ? ? ?//刪除已經存在任務await this.Scheduler.Result.DeleteJob(jk);} ? ? ? ? ? ? ? ?//反射獲取任務執行類 ? ? ? ? ? ? ? ?// var jobType = FileHelper.GetAbsolutePath(m.AssemblyName, m.AssemblyName + "." + m.ClassName); ? ? ? ? ? ? ? ?// 定義這個工作,并將其綁定到我們的IJob實現類 ? ? ? ? ? ? ? ?//IJobDetail job = new JobDetailImpl(m.JobName, m.JobGroup, jobType);IJobDetail job = JobBuilder.CreateForAsync<T>().WithIdentity(m.JobName, m.JobGroup).Build(); ? ? ? ? ? ? ? ?// 創建觸發器 ? ? ? ? ? ? ? ?ITrigger trigger; ? ? ? ? ? ? ? ?//校驗是否正確的執行周期表達式if (!string.IsNullOrEmpty(m.Cron) && CronExpression.IsValidExpression(m.Cron)){trigger = CreateCronTrigger(m);} ? ? ? ? ? ? ? ?else{trigger = CreateSimpleTrigger(m);} ? ? ? ? ? ? ? ?// 告訴Quartz使用我們的觸發器來安排作業await this.Scheduler.Result.ScheduleJob(job, trigger);result.Code = 1000;} ? ? ? ? ? ?catch (Exception ex){ ? ? ? ? ? ? ? ?await Console.Out.WriteLineAsync(string.Format("添加任務出錯", ex.Message));result.Code = 1001;result.Msg = ex.Message;} ? ? ? ? ? ?return result;} ? ? ? ?/// <summary>/// 暫停指定的計劃 ? ? ? ?/// </summary>/// <param name="jobGroup">任務分組</param>/// <param name="jobName">任務名稱</param>/// <param name="isDelete">停止并刪除任務</param>/// <returns></returns>public BaseQuartzNetResult StopScheduleJob<T>(string jobGroup, string jobName, bool isDelete = false) where T : ScheduleManage, new(){BaseQuartzNetResult result; ? ? ? ? ? ?try{ ? ? ? ? ? ? ? ?this.Scheduler.Result.PauseJob(new JobKey(jobName, jobGroup)); ? ? ? ? ? ? ? ?if (isDelete){Activator.CreateInstance<T>().RemoveScheduleModel(jobGroup, jobName);}result = new BaseQuartzNetResult{Code = 1000,Msg = "停止任務計劃成功!"};} ? ? ? ? ? ?catch (Exception ex){result = new BaseQuartzNetResult{Code = -1,Msg = "停止任務計劃失敗"};} ? ? ? ? ? ?return result;} ? ? ? ?/// <summary>/// 恢復運行暫停的任務 ? ? ? ?/// </summary>/// <param name="jobName">任務名稱</param>/// <param name="jobGroup">任務分組</param>public async void ResumeJob(string jobName, string jobGroup){ ? ? ? ? ? ?try{ ? ? ? ? ? ? ? ?//檢查任務是否存在var jk = new JobKey(jobName, jobGroup); ? ? ? ? ? ? ? ?if (await this.Scheduler.Result.CheckExists(jk)){ ? ? ? ? ? ? ? ? ? ?//任務已經存在則暫停任務await this.Scheduler.Result.ResumeJob(jk); ? ? ? ? ? ? ? ? ? ?await Console.Out.WriteLineAsync(string.Format("任務“{0}”恢復運行", jobName));}} ? ? ? ? ? ?catch (Exception ex){ ? ? ? ? ? ? ? ?await Console.Out.WriteLineAsync(string.Format("恢復任務失敗!{0}", ex));}} ? ? ? /// <summary>/// 停止任務調度 ? ? ? ?/// </summary>public async void StopScheduleAsync(){ ? ? ? ? ? ?try{ ? ? ? ? ? ? ? ?//判斷調度是否已經關閉if (!this.Scheduler.Result.IsShutdown){ ? ? ? ? ? ? ? ? ? ?//等待任務運行完成await this.Scheduler.Result.Shutdown(); ? ? ? ? ? ? ? ? ? ?await Console.Out.WriteLineAsync("任務調度停止!");}} ? ? ? ? ? ?catch (Exception ex){ ? ? ? ? ? ? ? ?await Console.Out.WriteLineAsync(string.Format("任務調度停止失敗!", ex));}} ? ? ? ?/// <summary>/// 創建類型Simple的觸發器 ? ? ? ?/// </summary>/// <param name="m"></param>/// <returns></returns>private ITrigger CreateSimpleTrigger(ScheduleEntity m){ ? ? ? ? ? ?//作業觸發器if (m.RunTimes > 0){ ? ? ? ? ? ? ? ?return TriggerBuilder.Create().WithIdentity(m.JobName, m.JobGroup).StartAt(m.BeginTime)//開始時間.EndAt(m.EndTime)//結束數據.WithSimpleSchedule(x => x.WithIntervalInSeconds(m.IntervalSecond)//執行時間間隔,單位秒.WithRepeatCount(m.RunTimes))//執行次數、默認從0開始.ForJob(m.JobName, m.JobGroup)//作業名稱 ? ? ? ? ? ? ? .Build();} ? ? ? ? ? ?else{ ? ? ? ? ? ? ? ?return TriggerBuilder.Create().WithIdentity(m.JobName, m.JobGroup).StartAt(m.BeginTime)//開始時間.EndAt(m.EndTime)//結束數據.WithSimpleSchedule(x => x.WithIntervalInSeconds(m.IntervalSecond)//執行時間間隔,單位秒.RepeatForever())//無限循環.ForJob(m.JobName, m.JobGroup)//作業名稱 ? ? ? ? ? ? ? .Build();}} ? ? ? ?/// <summary>/// 創建類型Cron的觸發器 ? ? ? ?/// </summary>/// <param name="m"></param>/// <returns></returns>private ITrigger CreateCronTrigger(ScheduleEntity m){ ? ? ? ? ? ?// 作業觸發器return TriggerBuilder.Create().WithIdentity(m.JobName, m.JobGroup).StartAt(m.BeginTime)//開始時間.EndAt(m.EndTime)//結束時間.WithCronSchedule(m.Cron)//指定cron表達式.ForJob(m.JobName, m.JobGroup)//作業名稱 ? ? ? ? ? ? ? ? ? .Build();}} }

?總結:

開發已個小項目搞了好久才搞完,期間零零散散的開發,還是太懶散了!平時積累不夠,還是太菜了!!!!!歡迎各位大佬指導指定我這個新人!

原文:http://www.cnblogs.com/miskis/p/8487634.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結

以上是生活随笔為你收集整理的Asp.Net Core2.0 基于QuartzNet任务管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。