From ecad98aa74a1284a036572fa364bcc352480149c Mon Sep 17 00:00:00 2001
From: yl <ykxkd@outlook.com>
Date: 星期一, 11 五月 2026 08:01:35 +0800
Subject: [PATCH] 1.车间综合看板接口调整 2.报工记录子表和不良记录表写入报工人员,班组编码 3.修改调整定时任务写入到数据库,并实现消息推送
---
VueWebCoreApi/Quartz/QuartzNETExtension.cs | 646 ++++++++++++++++++++++++++++------------------------------
1 files changed, 309 insertions(+), 337 deletions(-)
diff --git a/VueWebCoreApi/Quartz/QuartzNETExtension.cs b/VueWebCoreApi/Quartz/QuartzNETExtension.cs
index 51e3bdf..65aa095 100644
--- a/VueWebCoreApi/Quartz/QuartzNETExtension.cs
+++ b/VueWebCoreApi/Quartz/QuartzNETExtension.cs
@@ -17,110 +17,142 @@
namespace VueWebCoreApi.Extensions
{
+ /// <summary>
+ /// Quartz.NET 鎵╁睍鏂规硶绫�
+ /// 灏佽Quartz浠诲姟鐨勫垵濮嬪寲銆佸鍒犳敼鏌ャ�佸惎鍋溿�佺珛鍗虫墽琛岀瓑鏍稿績鎿嶄綔
+ /// 瑙e喅浜哠cheduler鍚姩銆佸唴瀛樹笌鏁版嵁搴撶姸鎬佸悓姝ャ�丆ron琛ㄨ揪寮忓吋瀹广�並ey鍖归厤绛夋牳蹇冮棶棰�
+ /// </summary>
public static class QuartzNETExtension
{
- public static ToMessage mes = new ToMessage(); //瀹氫箟鍏ㄥ眬杩斿洖淇℃伅瀵硅薄
+ /// <summary>
+ /// 鍏ㄥ眬杩斿洖淇℃伅瀵硅薄锛堢粺涓�鎺ュ彛杩斿洖鏍煎紡锛�
+ /// 鍖呭惈code(鐘舵�佺爜)銆乧ount(鏁伴噺)銆乵essage(鎻愮ず淇℃伅)銆乨ata(鏁版嵁)
+ /// </summary>
+ public static ToMessage mes = new ToMessage();
+ /// <summary>
+ /// 鍐呭瓨绾т换鍔″垪琛ㄧ紦瀛�
+ /// 鐢ㄤ簬鍑忓皯鏁版嵁搴撴煡璇紝鍚屾椂淇濊瘉鍐呭瓨涓庢暟鎹簱鐘舵�佷竴鑷�
+ /// </summary>
private static List<TaskOptions> _taskList = new List<TaskOptions>();
/// <summary>
- /// 鍒濆鍖栦綔涓�
+ /// 鎵╁睍IApplicationBuilder锛屽垵濮嬪寲Quartz浠诲姟璋冨害鍣ㄥ苟鍔犺浇鎵�鏈変换鍔�
+ /// 銆愭牳蹇冧慨澶嶃�戣В鍐砆uartz榛樿涓嶅惎鍔⊿cheduler鐨勯棶棰�
/// </summary>
- /// <param name="applicationBuilder"></param>
- /// <param name="env"></param>
- /// <returns></returns>
- public static IApplicationBuilder UseQuartz(this IApplicationBuilder applicationBuilder, IWebHostEnvironment env)
+ /// <param name="app">ASP.NET Core搴旂敤鏋勫缓鍣�</param>
+ /// <param name="env">Web涓绘満鐜</param>
+ /// <returns>搴旂敤鏋勫缓鍣紙閾惧紡璋冪敤锛�</returns>
+ public static IApplicationBuilder UseQuartz(this IApplicationBuilder app, IWebHostEnvironment env)
{
- IServiceProvider services = applicationBuilder.ApplicationServices;
+ // 浠嶥I瀹瑰櫒鑾峰彇渚濊禆鏈嶅姟
+ var services = app.ApplicationServices;
+ // Quartz璋冨害鍣ㄥ伐鍘�
+ var schedulerFactory = services.GetService<ISchedulerFactory>();
+ // 鑷畾涔塓uartz浠撳偍锛堟暟鎹簱鎿嶄綔锛�
+ var quartzRepo = services.GetService<QuartzRepository>();
- ISchedulerFactory _schedulerFactory = services.GetService<ISchedulerFactory>();
-
- string path = FileQuartz.CreateQuartzRootPath(env);
- //鏌ユ壘浠诲姟鍒楄〃
- var data = QuartzSearchData.QuartzSearch();
- if (data.Rows.Count <= 0)
+ // 1. 鏍稿績淇锛歈uartz榛樿涓嶄細鑷姩鍚姩Scheduler锛屽繀椤绘樉寮忓惎鍔�
+ var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult();
+ if (!scheduler.IsStarted)
{
- FileHelper.WriteFile(FileQuartz.LogPath, "start.txt", $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},娌℃湁榛樿閰嶇疆浠诲姟\r\n", true);
- return applicationBuilder;
+ scheduler.Start().GetAwaiter().GetResult();
}
- string jobConfig = JsonConvert.SerializeObject(data);
-
- //string jobConfig = FileHelper.ReadFile(path + QuartzFileInfo.JobConfigFileName);
- //if (string.IsNullOrEmpty(jobConfig))
- //{
- // FileHelper.WriteFile(FileQuartz.LogPath, "start.txt", $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},娌℃湁榛樿閰嶇疆浠诲姟\r\n", true);
- // return applicationBuilder;
- //}
-
+ // 2. 浠庢暟鎹簱鍔犺浇鎵�鏈夐厤缃殑浠诲姟
+ var taskList = quartzRepo.GetAllTasksAsync().GetAwaiter().GetResult();
+ if (taskList.Count == 0)
+ {
+ //鏃犱换鍔℃椂璁板綍鍚姩鏃ュ織
+ quartzRepo.WriteStartLogAsync($"{DateTime.Now:yyyy-MM-dd HH:mm:ss},娌℃湁榛樿閰嶇疆浠诲姟").GetAwaiter().GetResult();
+ return app;
+ }
+ // 3. 閬嶅巻浠诲姟骞跺垵濮嬪寲锛堣褰曞け璐ユ暟鍜屽紓甯镐俊鎭級
int errorCount = 0;
- string errorMsg = "";
- TaskOptions options = null;
- try
+ string errorMsg = string.Empty;
+ // 鍒濆鍖栧唴瀛樹换鍔″垪琛�
+ _taskList = taskList;
+
+ foreach (var task in taskList)
{
- _taskList = JsonConvert.DeserializeObject<List<TaskOptions>>(jobConfig);
- _taskList.ForEach(x =>
+ try
{
- options = x;
- var result = x.AddJob(_schedulerFactory, true, jobFactory: services.GetService<IJobFactory>()).GetAwaiter().GetResult();
- });
+ //var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>()).GetAwaiter().GetResult();
+ // 璋冪敤TaskOptions鐨凙ddJob鏂规硶娣诲姞浠诲姟鍒拌皟搴﹀櫒
+ // 浼犲叆浠撳偍鐢ㄤ簬鏁版嵁搴撴搷浣滐紝浼犲叆JobFactory鐢ㄤ簬鑷畾涔塉ob瀹炰緥鍖�
+ var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>(), quartzRepo).GetAwaiter().GetResult();
+ }
+ catch (Exception ex)
+ {
+ // 璁板綍鍗曚釜浠诲姟鍒濆鍖栧け璐ヤ俊鎭�
+ errorCount++;
+ errorMsg += $"浣滀笟:{task.TaskName},寮傚父锛歿ex.Message};";
+ }
}
- catch (Exception ex)
- {
- errorCount = +1;
- errorMsg += $"浣滀笟:{options?.TaskName},寮傚父锛歿ex.Message}";
- }
- string content = $"鎴愬姛:{ _taskList.Count - errorCount}涓�,澶辫触{errorCount}涓�,寮傚父锛歿errorMsg}\r\n";
- FileQuartz.WriteStartLog(content);
+ // 4. 璁板綍鏁翠綋鍒濆鍖栫粨鏋滄棩蹇�
+ var content = $"鎴愬姛:{taskList.Count - errorCount}涓�,澶辫触{errorCount}涓�,寮傚父锛歿errorMsg}";
+ quartzRepo.WriteStartLogAsync($"{DateTime.Now:yyyy-MM-dd HH:mm:ss},{content}").GetAwaiter().GetResult();
-
- return applicationBuilder;
+ return app;
}
/// <summary>
- /// 鑾峰彇鎵�鏈夌殑浣滀笟
+ /// 鑾峰彇璋冨害鍣ㄤ腑鎵�鏈変换鍔★紝骞跺悓姝ュ唴瀛�/鏁版嵁搴撶姸鎬侊紙鏍稿績淇锛氳В鍐冲唴瀛樺垪琛ㄤ笌鏁版嵁搴撲笉涓�鑷撮棶棰橈級
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <returns></returns>
- public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鏈�鏂扮殑浠诲姟鍒楄〃</returns>
+ public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory, QuartzRepository quartzRepo)
{
- List<TaskOptions> list = new List<TaskOptions>();
+ var list = new List<TaskOptions>();
try
{
- IScheduler _scheduler = await schedulerFactory.GetScheduler();
- var groups = await _scheduler.GetJobGroupNames();
+ var scheduler = await schedulerFactory.GetScheduler();
+ // 纭繚Scheduler澶勪簬鍚姩鐘舵�侊紙闃插尽鎬х紪绋嬶級
+ if (!scheduler.IsStarted) await scheduler.Start();
+ // 1. 鑾峰彇鎵�鏈変换鍔″垎缁勶紙Quartz浠诲姟鎸夊垎缁勭鐞嗭級
+ var groups = await scheduler.GetJobGroupNames();
+
foreach (var groupName in groups)
{
- foreach (var jobKey in await _scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)))
+ // 2. 鑾峰彇鍒嗙粍涓嬫墍鏈塉obKey锛堜换鍔″敮涓�鏍囪瘑锛氬悕绉�+鍒嗙粍锛�
+ var jobKeys = await scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName));
+ foreach (var jobKey in jobKeys)
{
- TaskOptions taskOptions = _taskList.Where(x => x.GroupName == jobKey.Group && x.TaskName == jobKey.Name)
- .FirstOrDefault();
- if (taskOptions == null)
- continue;
-
- var triggers = await _scheduler.GetTriggersOfJob(jobKey);
- foreach (ITrigger trigger in triggers)
+ // 3. 鏍稿績淇锛氫紭鍏堜粠鏁版嵁搴撹幏鍙栨渶鏂颁换鍔★紙閬垮厤鍐呭瓨鏁版嵁杩囨湡锛�
+ var dbTask = await quartzRepo.TaskExists(jobKey.Name, jobKey.Group);
+ // 鏁版嵁搴撴棤鏁版嵁鏃讹紝闄嶇骇浠庡唴瀛樺垪琛ㄨ幏鍙�
+ var task = dbTask.FirstOrDefault() ?? _taskList.FirstOrDefault(x => x.GroupName == jobKey.Group && x.TaskName == jobKey.Name);
+ // 杩囨护鏃犳晥浠诲姟
+ if (task == null) continue;
+ // 4. 鑾峰彇浠诲姟鍏宠仈鐨勮Е鍙戝櫒锛圦uartz浠诲姟閫氳繃瑙﹀彂鍣ㄨЕ鍙戞墽琛岋級
+ var triggers = await scheduler.GetTriggersOfJob(jobKey);
+ foreach (var trigger in triggers)
{
- DateTimeOffset? dateTimeOffset = trigger.GetPreviousFireTimeUtc();
- if (dateTimeOffset != null)
+ // 5. 鍚屾瑙﹀彂鍣ㄥ疄闄呯姸鎬佸埌浠诲姟瀵硅薄锛屽苟鏇存柊鍒版暟鎹簱
+ task.Status = (int)await scheduler.GetTriggerState(trigger.Key);
+ await quartzRepo.UpdateTaskAsync(task); // 鐘舵�佸悓姝ュ埌搴�
+ // 6. 鍚屾浠诲姟鏈�鍚庢墽琛屾椂闂�
+ if (trigger.GetPreviousFireTimeUtc() != null)
{
- taskOptions.LastRunTime = Convert.ToDateTime(dateTimeOffset.ToString());
- //鏇存敼鏈�鍚庢墽琛屾椂闂�
- bool aa = QuartzSearchData.QuartzUpdate(taskOptions);
+ // 浼樺厛浠庤Е鍙戝櫒鑾峰彇鏈�鍚庢墽琛屾椂闂达紙UTC杞湰鍦版椂闂达級
+ task.LastRunTime = trigger.GetPreviousFireTimeUtc()?.LocalDateTime;
+ await quartzRepo.UpdateTaskLastRunTimeAsync(task.TaskName, task.GroupName, task.LastRunTime.Value);
}
else
{
- var runlog = FileQuartz.GetJobRunLog(taskOptions.TaskName, taskOptions.GroupName, 1, 2);
- if (runlog.Count > 0)
+ // 瑙﹀彂鍣ㄦ棤璁板綍鏃讹紝浠庢墽琛屾棩蹇椾腑鑾峰彇鏈�鍚庢墽琛屾椂闂�
+ var logs = await quartzRepo.GetJobRunLogAsync(task.TaskName, task.GroupName, 1, 1);
+ if (logs.Count > 0 && DateTime.TryParse(logs[0].BeginDate, out var lastRunTime))
{
- DateTime.TryParse(runlog[0].BeginDate, out DateTime lastRunTime);
- taskOptions.LastRunTime = lastRunTime;
- //鏇存敼鏈�鍚庢墽琛屾椂闂�
- bool aa = QuartzSearchData.QuartzUpdate(taskOptions);
+ task.LastRunTime = lastRunTime;
+ await quartzRepo.UpdateTaskLastRunTimeAsync(task.TaskName, task.GroupName, lastRunTime);
}
}
}
- list.Add(taskOptions);
+ list.Add(task);
}
}
+ // 7. 鍚屾鍐呭瓨鍒楄〃涓烘渶鏂版暟鎹紙淇濊瘉鍚庣画鎿嶄綔浣跨敤鏈�鏂扮姸鎬侊級
+ _taskList = list;
}
catch (Exception ex)
{
@@ -128,314 +160,246 @@
mes.count = 0;
mes.message = ex.Message + ex.StackTrace;
mes.data = null;
- FileQuartz.WriteStartLog("鑾峰彇浣滀笟寮傚父锛�" + ex.Message + ex.StackTrace);
+ await quartzRepo.WriteStartLogAsync($"鑾峰彇浣滀笟寮傚父锛歿ex.Message}{ex.StackTrace}");
+ return new List<TaskOptions>();
}
return list;
}
/// <summary>
- /// 娣诲姞浣滀笟
+ /// 鏂板Quartz浠诲姟锛堝垵濮嬪寲/鎵嬪姩娣诲姞閫氱敤锛�
/// </summary>
- /// <param name="taskOptions"></param>
- /// <param name="schedulerFactory"></param>
- /// <param name="init">鏄惁鍒濆鍖�,鍚�=闇�瑕侀噸鏂扮敓鎴愰厤缃枃浠讹紝鏄�=涓嶉噸鏂扮敓鎴愰厤缃枃浠�</param>
- /// <returns></returns>
- public static async Task<object> AddJob(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, bool init = false, IJobFactory jobFactory = null)
+ /// <param name="task">浠诲姟閰嶇疆椤�</param>
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="init">鏄惁涓哄垵濮嬪寲闃舵锛堝垵濮嬪寲鏃朵笉閲嶅鍏ュ簱锛�</param>
+ /// <param name="jobFactory">Job宸ュ巶锛堣嚜瀹氫箟Job瀹炰緥鍖栭�昏緫锛�</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>缁熶竴杩斿洖缁撴灉锛圱oMessage锛�</returns>
+ public static async Task<object> AddJob(this TaskOptions task, ISchedulerFactory schedulerFactory, bool init = false, IJobFactory jobFactory = null, QuartzRepository quartzRepo = null)
{
try
{
- //澶勭悊鍓嶇Corn琛ㄨ揪寮忔渶鍚庝竴涓湀鐨勬槦鏈熷ぉ琛ㄨ揪寮忕己闄烽棶棰�
- string resultString = "";
- string[] str = taskOptions.Interval.Split(" ");
- if ((str[3].Equals("1L") || str[3].Equals("2L") || str[3].Equals("3L") || str[3].Equals("4L") || str[3].Equals("5L") || str[3].Equals("6L") || str[3].Equals("7L")) && str[5].Equals("?"))
+ // 1. 淇鍓嶇浼犲叆鐨凜ron琛ㄨ揪寮忓吋瀹规�ч棶棰�
+ task.Interval = FixCronExpression(task.Interval);
+ // 2. 楠岃瘉Cron琛ㄨ揪寮忔湁鏁堟��
+ var (isValid, msg) = task.Interval.IsValidExpression();
+ if (!isValid)
+ return new ToMessage { code = "300", count = 0, message = msg, data = null };
+ // 3. 闈炲垵濮嬪寲闃舵锛氭牎楠屼换鍔℃槸鍚﹀凡瀛樺湪锛堥伩鍏嶉噸澶嶆坊鍔狅級
+ if (!init && await quartzRepo.TaskExistsAsync(task.TaskName, task.GroupName))
{
- str[5] = str[3];
- str[3] = "?";
- for (int i = 0; i < str.Length; i++)
- {
- resultString += str[i] + " ";
- }
- taskOptions.Interval = resultString;
+ return new ToMessage { code = "300", count = 0, message = $"浣滀笟:{task.TaskName},鍒嗙粍锛歿task.GroupName}宸茬粡瀛樺湪", data = null };
}
- (bool, string) validExpression = taskOptions.Interval.IsValidExpression();
- if (!validExpression.Item1)
- return new { code = 300,count=0,Message=validExpression.Item2,data="null" };
-
- (bool, object) result = taskOptions.Exists(init);
- if (!result.Item1)
- return result.Item2;
+ // 4. 闈炲垵濮嬪寲闃舵锛氭柊澧炰换鍔″埌鍐呭瓨+鏁版嵁搴�+璁板綍鎿嶄綔鏃ュ織
if (!init)
{
- //灏嗗巻鍙蹭换鍔″強鏂板鍔犱换鍔″ぉ鍔犲埌List闆嗗悎
- _taskList.Add(taskOptions);
- //灏嗛泦鍚堟暟鎹坊鍔犲埌json鏂囦欢(瑕嗙洊寮�)
- FileQuartz.WriteJobConfig(_taskList);
- //灏嗗綋鍓嶆柊浠诲姟娣诲姞鍒版暟鎹〃
- bool aa = QuartzSearchData.QuartzCreate(taskOptions);
+ _taskList.Add(task);// 鍐呭瓨娣诲姞
+ await quartzRepo.CreateTaskAsync(task);// 鏁版嵁搴撴坊鍔�
+ await quartzRepo.AddJobActionLogAsync(JobAction.鏂板.ToString(), task.TaskName, task.GroupName, "鏂板浠诲姟鎴愬姛");// 鎿嶄綔鏃ュ織
}
+ // 5. 鏋勫缓Quartz Job锛堜换鍔℃墽琛屼綋锛�
+ var job = JobBuilder.Create<HttpResultfulJob>()// HttpResultfulJob锛氳嚜瀹氫箟鐨凥TTP璇锋眰鍨婮ob
+ .WithIdentity(task.TaskName, task.GroupName)// 璁剧疆Job鍞竴鏍囪瘑锛堝悕绉�+鍒嗙粍锛�
+ .Build();
- IJobDetail job = JobBuilder.Create<HttpResultfulJob>().WithIdentity(taskOptions.TaskName, taskOptions.GroupName).Build();
- ITrigger trigger = TriggerBuilder.Create()
- .WithIdentity(taskOptions.TaskName, taskOptions.GroupName)
- .StartNow()
- .WithDescription(taskOptions.Describe)
- .WithCronSchedule(taskOptions.Interval)
- .Build();
+ // 6. 鏋勫缓Cron瑙﹀彂鍣紙鎸塁ron琛ㄨ揪寮忚Е鍙戯級
+ var trigger = TriggerBuilder.Create()
+ .WithIdentity(task.TaskName, task.GroupName)// 瑙﹀彂鍣ㄥ敮涓�鏍囪瘑锛堜笌Job淇濇寔涓�鑷达級
+ .StartNow()// 绔嬪嵆鍚姩
+ .WithDescription(task.Describe)// 浠诲姟鎻忚堪
+ .WithCronSchedule(task.Interval)// 缁戝畾Cron琛ㄨ揪寮�
+ .Build();
- IScheduler scheduler = await schedulerFactory.GetScheduler();
-
- if (jobFactory == null)
- {
- try
- {
- jobFactory = HttpContext.Current.RequestServices.GetService<IJobFactory>();
- }
- catch (Exception ex)
- {
- Console.WriteLine($"鍒涘缓浠诲姟[{taskOptions.TaskName}]寮傚父,{ex.Message}");
- }
- }
-
+ // 7. 鑾峰彇璋冨害鍣ㄥ苟纭繚鍚姩
+ var scheduler = await schedulerFactory.GetScheduler();
+ if (!scheduler.IsStarted) await scheduler.Start(); // 纭繚鍚姩
+ // 8. 璁剧疆鑷畾涔塉obFactory锛堝闇�鎺у埗Job鐨勪緷璧栨敞鍏�/瀹炰緥鍖栵級
if (jobFactory != null)
{
scheduler.JobFactory = jobFactory;
}
+ // 9. 灏咼ob鍜岃Е鍙戝櫒缁戝畾鍒拌皟搴﹀櫒
await scheduler.ScheduleJob(job, trigger);
- if (taskOptions.Status == (int)TriggerState.Normal)
+
+ // 10. 鏍规嵁浠诲姟鐘舵�佽缃Е鍙戝櫒鍚仠
+ if (task.Status == (int)TriggerState.Normal)
{
- await scheduler.Start();
+ await scheduler.ResumeTrigger(trigger.Key);// 鏄惧紡鎭㈠锛堢‘淇濊Е鍙戝櫒姝e父杩愯锛�
}
else
{
- await scheduler.PauseJob(job.Key);
- // await schedulerFactory.Pause(taskOptions);
- FileQuartz.WriteStartLog($"浣滀笟:{taskOptions.TaskName},鍒嗙粍:{taskOptions.GroupName},鏂板缓鏃舵湭鍚姩鍘熷洜,鐘舵�佷负:{taskOptions.Status}");
+ await scheduler.PauseJob(job.Key);// 鏆傚仠浠诲姟
+ await quartzRepo.WriteStartLogAsync($"浣滀笟:{task.TaskName},鍒嗙粍:{task.GroupName},鏂板缓鏃舵湭鍚姩鍘熷洜,鐘舵�佷负:{task.Status}");
}
- if (!init)
- FileQuartz.WriteJobAction(JobAction.鏂板, taskOptions.TaskName, taskOptions.GroupName);
mes.code = "200";
mes.count = 0;
- mes.message ="鎵ц鎴愬姛锛�";
+ mes.message = "鎵ц鎴愬姛锛�";
mes.data = null;
}
catch (Exception ex)
{
- mes.code = "300";
- mes.count = 0;
- mes.message = ex.Message;
- mes.data = null;
- return new { status = false, msg = ex.Message };
+ return new ToMessage { code = "300", count = 0, message = ex.Message, data = null };
}
return mes;
}
/// <summary>
- /// 绉婚櫎浣滀笟
+ /// 绉婚櫎锛堝垹闄わ級浠诲姟
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskName"></param>
- /// <param name="groupName"></param>
- /// <returns></returns>
- public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.鍒犻櫎, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.鍒犻櫎, task, quartzRepo);
}
/// <summary>
- /// 鏇存柊浣滀笟
+ /// 淇敼浠诲姟閰嶇疆
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">鏂扮殑浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.淇敼, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.淇敼, task, quartzRepo);
}
/// <summary>
- /// 鏆傚仠浣滀笟
+ /// 鏆傚仠浠诲姟
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.鏆傚仠, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.鏆傚仠, task, quartzRepo);
}
/// <summary>
- /// 鍚姩浣滀笟
+ /// 鍚姩锛堟仮澶嶏級浠诲姟
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.寮�鍚�, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.寮�鍚�, task, quartzRepo);
}
/// <summary>
- /// 绔嬪嵆鎵ц涓�娆′綔涓�
+ /// 绔嬪嵆鎵ц浠诲姟锛堟棤瑙咰ron琛ㄨ揪寮忥級
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Run(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Run(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.绔嬪嵆鎵ц, taskOptions);
- }
-
- public static object ModifyTaskEntity(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, JobAction action)
- {
- TaskOptions options = null;
- object result = null;
- switch (action)
- {
- case JobAction.鍒犻櫎:
- for (int i = 0; i < _taskList.Count; i++)
- {
- options = _taskList[i];
- if (options.TaskName == taskOptions.TaskName && options.GroupName == taskOptions.GroupName)
- {
- _taskList.RemoveAt(i);
- //鍒犻櫎浠诲姟
- bool aa = QuartzSearchData.QuartzDelete(options);
- }
- }
- break;
- case JobAction.淇敼:
- options = _taskList.Where(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName).FirstOrDefault();
- //绉婚櫎浠ュ墠鐨勯厤缃�
- if (options != null)
- {
- _taskList.Remove(options);
- //鍒犻櫎浠诲姟
- bool aa = QuartzSearchData.QuartzDelete(options);
- }
-
- //鐢熸垚浠诲姟骞舵坊鍔犳柊閰嶇疆
- result = taskOptions.AddJob(schedulerFactory, false).GetAwaiter().GetResult();
- break;
- case JobAction.鏆傚仠:
- case JobAction.寮�鍚�:
- case JobAction.鍋滄:
- case JobAction.绔嬪嵆鎵ц:
- options = _taskList.Where(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName).FirstOrDefault();
- if (action == JobAction.鏆傚仠)
- {
- options.Status = (int)TriggerState.Paused;
- //鏇存柊浠诲姟鐘舵��
- bool aa= QuartzSearchData.QuartzUpdate(options);
- }
- else if (action == JobAction.鍋滄)
- {
- options.Status = (int)action;
- //鏇存柊浠诲姟鐘舵��
- bool aa = QuartzSearchData.QuartzUpdate(options);
- }
- else
- {
- options.Status = (int)TriggerState.Normal;
- //鏇存柊浠诲姟鐘舵��
- bool aa = QuartzSearchData.QuartzUpdate(options);
- }
- break;
- }
- //鐢熸垚閰嶇疆鏂囦欢
- FileQuartz.WriteJobConfig(_taskList);
- FileQuartz.WriteJobAction(action, taskOptions.TaskName, taskOptions.GroupName, "鎿嶄綔瀵硅薄锛�" + JsonConvert.SerializeObject(taskOptions));
- return result;
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.绔嬪嵆鎵ц, task, quartzRepo);
}
/// <summary>
- /// 瑙﹀彂鏂板銆佸垹闄ゃ�佷慨鏀广�佹殏鍋溿�佸惎鐢ㄣ�佺珛鍗虫墽琛屼簨浠�
+ /// 浠诲姟鎿嶄綔鏍稿績閫昏緫锛堟牳蹇冧慨澶嶏細Key鍖归厤+鐘舵�佸悓姝�+Scheduler鍚姩鏍¢獙锛�
+ /// 灏佽鍒犻櫎/淇敼/鏆傚仠/寮�鍚�/绔嬪嵆鎵ц鐨勯�氱敤閫昏緫锛岄伩鍏嶄唬鐮佸啑浣�
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskName"></param>
- /// <param name="groupName"></param>
- /// <param name="action"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static async Task<object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions taskOptions = null)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="taskName">浠诲姟鍚嶇О</param>
+ /// <param name="groupName">鍒嗙粍鍚嶇О</param>
+ /// <param name="action">鎿嶄綔绫诲瀷锛堝垹闄�/淇敼/鏆傚仠/寮�鍚�/绔嬪嵆鎵ц锛�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ private static async Task<object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions task, QuartzRepository quartzRepo)
{
- string errorMsg = "";
try
{
- //澶勭悊鍓嶇Corn琛ㄨ揪寮忔渶鍚庝竴涓湀鐨勬槦鏈熷ぉ琛ㄨ揪寮忕己闄烽棶棰�
- string resultString = "";
- string[] str = taskOptions.Interval.Split(" ");
- if ((str[3].Equals("1L") || str[3].Equals("2L") || str[3].Equals("3L") || str[3].Equals("4L") || str[3].Equals("5L") || str[3].Equals("6L") || str[3].Equals("7L")) && str[5].Equals("?"))
- {
- str[5] = str[3];
- str[3] = "?";
- for (int i = 0; i < str.Length; i++)
- {
- resultString += str[i] + " ";
- }
- taskOptions.Interval = resultString;
- }
- IScheduler scheduler = await schedulerFactory.GetScheduler();
- List<JobKey> jobKeys = scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)).Result.ToList();
- if (jobKeys == null || jobKeys.Count() == 0)
- {
- errorMsg = $"鏈壘鍒板垎缁刐{groupName}]";
- return new { code = 300, count = 0, Message = errorMsg, data = "null" };
- //return new { status = false, msg = errorMsg };
- }
- JobKey jobKey = jobKeys.Where(s => scheduler.GetTriggersOfJob(s).Result.Any(x => (x as CronTriggerImpl).Name == taskName)).FirstOrDefault();
- if (jobKey == null)
- {
- errorMsg = $"鏈壘鍒拌Е鍙戝櫒[{taskName}]";
- return new { code = 300, count = 0, Message = errorMsg, data = "null" };
- }
- var triggers = await scheduler.GetTriggersOfJob(jobKey);
- ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault();
+ // 1. 棰勫鐞咰ron琛ㄨ揪寮忥紙淇鍓嶇浼犲叆鐨勮〃杈惧紡锛�
+ if (task != null) task.Interval = FixCronExpression(task.Interval);
- if (trigger == null)
+ // 2. 鑾峰彇璋冨害鍣ㄥ苟纭繚鍚姩锛堟牳蹇冧慨澶�1锛氬叏灞�Scheduler鍚姩鏍¢獙锛�
+ var scheduler = await schedulerFactory.GetScheduler();
+ // 鏍稿績淇1锛氱‘淇漇cheduler鍏ㄥ眬鍚姩
+ if (!scheduler.IsStarted) await scheduler.Start();
+
+ // 3. 鏍稿績淇2锛氭纭瀯寤篔obKey锛堜换鍔″悕+鍒嗙粍锛夛紝瑙e喅Key鍖归厤澶辫触闂
+ var jobKey = new JobKey(taskName, groupName);
+ if (!await scheduler.CheckExists(jobKey))
{
- errorMsg = $"鏈壘鍒拌Е鍙戝櫒[{taskName}]";
- return new { code = 300, count = 0, Message = errorMsg, data = "null" };
+ return new ToMessage { code = "300", count = 0, message = $"鏈壘鍒颁换鍔{taskName}-{groupName}]", data = null };
}
+
+ // 4. 鑾峰彇浠诲姟鍏宠仈鐨勮Е鍙戝櫒锛堟棤瑙﹀彂鍣ㄥ垯浠诲姟鏃犳硶鎵ц锛�
+ var triggers = await scheduler.GetTriggersOfJob(jobKey);
+ if (triggers == null || !triggers.Any())
+ {
+ return new ToMessage { code = "300", count = 0, message = $"浠诲姟[{taskName}-{groupName}]鏃犺Е鍙戝櫒", data = null };
+ }
+ // 鍙栫涓�涓Е鍙戝櫒锛堝崟浠诲姟榛樿缁戝畾涓�涓Е鍙戝櫒锛�
+ var trigger = triggers.First();
+
object result = null;
+ // 5. 鏍规嵁鎿嶄綔绫诲瀷鎵ц涓嶅悓閫昏緫
switch (action)
{
case JobAction.鍒犻櫎:
- case JobAction.淇敼:
+ // 鏆傚仠瑙﹀彂鍣� -> 瑙g粦瑙﹀彂鍣� -> 鍒犻櫎Job -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
await scheduler.PauseTrigger(trigger.Key);
- await scheduler.UnscheduleJob(trigger.Key);// 绉婚櫎瑙﹀彂鍣�
- await scheduler.DeleteJob(trigger.JobKey);
- result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
+ await scheduler.UnscheduleJob(trigger.Key);
+ await scheduler.DeleteJob(jobKey);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ await quartzRepo.DeleteTaskAsync(taskName, groupName);
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "鍒犻櫎浠诲姟鎴愬姛");
break;
+
+ case JobAction.淇敼:
+ // 淇敼閫昏緫锛氬厛鍒犻櫎鏃т换鍔� -> 閲嶆柊娣诲姞鏂伴厤缃� -> 璁板綍鏃ュ織
+ await scheduler.PauseTrigger(trigger.Key);
+ await scheduler.UnscheduleJob(trigger.Key);
+ await scheduler.DeleteJob(jobKey);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ await quartzRepo.DeleteTaskAsync(taskName, groupName);
+ result = await task.AddJob(schedulerFactory, false, null, quartzRepo);// 閲嶆柊娣诲姞浠诲姟
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, JsonConvert.SerializeObject(task));
+ break;
+
case JobAction.鏆傚仠:
- case JobAction.鍋滄:
- case JobAction.寮�鍚�:
- result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
- if (action == JobAction.鏆傚仠)
- {
- await scheduler.PauseTrigger(trigger.Key);
- }
- else if (action == JobAction.寮�鍚�)
- {
- await scheduler.ResumeTrigger(trigger.Key);
- // await scheduler.RescheduleJob(trigger.Key, trigger);
- }
- else
- {
- await scheduler.Shutdown();
- }
+ // 鏆傚仠瑙﹀彂鍣� -> 鏇存柊浠诲姟鐘舵�� -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
+ await scheduler.PauseTrigger(trigger.Key);
+ task.Status = (int)TriggerState.Paused;
+ await quartzRepo.UpdateTaskAsync(task);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ _taskList.Add(task); // 鍚屾鍐呭瓨鐘舵��
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "鏆傚仠浠诲姟鎴愬姛");
break;
+
+ case JobAction.寮�鍚�:
+ // 鎭㈠瑙﹀彂鍣� -> 鏇存柊浠诲姟鐘舵�� -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
+ await scheduler.ResumeTrigger(trigger.Key);
+ task.Status = (int)TriggerState.Normal;
+ await quartzRepo.UpdateTaskAsync(task);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ _taskList.Add(task); // 鍚屾鍐呭瓨鐘舵��
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "寮�鍚换鍔℃垚鍔�");
+ break;
+
case JobAction.绔嬪嵆鎵ц:
- if (taskOptions != null && taskOptions.Status != (int)TriggerState.Normal)
+ // 绔嬪嵆鎵ц鍓嶇‘淇濅换鍔″浜庡惎鍔ㄧ姸鎬� -> 瑙﹀彂Job绔嬪嵆鎵ц -> 璁板綍鏃ュ織
+ if (task.Status != (int)TriggerState.Normal)
{
- result = taskOptions.ModifyTaskEntity(schedulerFactory, JobAction.寮�鍚�);
- await scheduler.ResumeTrigger(trigger.Key);
-
+ task.Status = (int)TriggerState.Normal;
+ await quartzRepo.UpdateTaskAsync(task);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ _taskList.Add(task);
+ await scheduler.ResumeTrigger(trigger.Key);
}
- else {
- await scheduler.TriggerJob(jobKey);
- }
-
+ await scheduler.TriggerJob(jobKey); // 绔嬪嵆瑙﹀彂浠诲姟鎵ц
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "绔嬪嵆鎵ц浠诲姟鎴愬姛");
break;
}
mes.code = "200";
@@ -443,70 +407,78 @@
mes.message = $"浣滀笟{action.ToString()}鎴愬姛";
mes.data = null;
return result ?? mes;
- //return result ?? new { status = true, msg = $"浣滀笟{action.ToString()}鎴愬姛" };
}
catch (Exception ex)
{
- errorMsg = ex.Message;
- mes.code = "300";
- mes.count = 0;
- mes.message = errorMsg;
- mes.data = null;
- return mes;
- //return new { status = false, msg = ex.Message };
- }
- finally
- {
- FileQuartz.WriteJobAction(action, taskName, groupName, errorMsg);
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, $"鎿嶄綔澶辫触锛歿ex.Message}");
+ return new ToMessage { code = "300", count = 0, message = ex.Message, data = null };
}
}
/// <summary>
- ///
+ /// 淇鍓嶇浼犲叆鐨凜ron琛ㄨ揪寮忕己闄�
+ /// 鍏煎ASP.NET Core 3.1涓瑿ron琛ㄨ揪寮忕殑Day/Week瀛楁鍐欐硶闂
/// </summary>
- /// <param name="context"></param>閫氳繃浣滀笟涓婁笅鏂囪幏鍙栦綔涓氬搴旂殑閰嶇疆鍙傛暟
- /// <returns></returns>
- public static TaskOptions GetTaskOptions(this IJobExecutionContext context)
+ /// <param name="cron">鍘熷Cron琛ㄨ揪寮�</param>
+ /// <returns>淇鍚庣殑Cron琛ㄨ揪寮�</returns>
+ private static string FixCronExpression(string cron)
{
- AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger;
- TaskOptions taskOptions = _taskList.Where(x => x.TaskName == trigger.Name && x.GroupName == trigger.Group).FirstOrDefault();
- return taskOptions ?? _taskList.Where(x => x.TaskName == trigger.JobName && x.GroupName == trigger.JobGroup).FirstOrDefault();
+ if (string.IsNullOrEmpty(cron))
+ return cron;
+
+ // 鎷嗗垎Cron琛ㄨ揪寮忥紙鏍囧噯Cron锛氱 鍒� 鏃� 鏃� 鏈� 鍛� 骞达紙鍙�夛級锛�
+ var str = cron.Split(" ", StringSplitOptions.RemoveEmptyEntries);
+ if (str.Length < 6)
+ return cron;
+
+ // 鍏煎 ASP.NET Core 3.1 鐨勫啓娉曪紙鏇挎崲 or 璇硶锛�
+ // 淇鍦烘櫙锛欴ay瀛楁涓�1L/2L...7L 涓� 鍛ㄥ瓧娈典负? 鏃讹紝浜ゆ崲Day鍜屽懆瀛楁
+ // 鍘熷洜锛氬墠绔彲鑳芥贩娣嗕簡Day/鍛ㄥ瓧娈电殑鍐欐硶锛孮uartz瀵筁锛堟渶鍚庝竴澶╋級鐨勮В鏋愭湁鐗瑰畾瑙勫垯
+ var dayValue = str[3];// 绗�4涓瓧娈碉細Day
+ if ((dayValue == "1L" || dayValue == "2L" || dayValue == "3L" ||
+ dayValue == "4L" || dayValue == "5L" || dayValue == "6L" || dayValue == "7L") && str[5] == "?")
+ {
+ str[5] = str[3]; // 鍛ㄥ瓧娈� = 鍘烡ay瀛楁
+ str[3] = "?"; // Day瀛楁 = ?
+ return string.Join(" ", str);
+ }
+
+ return cron;
}
/// <summary>
- /// 浣滀笟鏄惁瀛樺湪
+ /// 楠岃瘉Cron琛ㄨ揪寮忔槸鍚︽湁鏁�
/// </summary>
- /// <param name="taskOptions"></param>
- /// <param name="init">鍒濆鍖栫殑涓嶉渶瑕佸垽鏂�</param>
- /// <returns></returns>
- public static (bool, object) Exists(this TaskOptions taskOptions, bool init)
- {
- if (!init && _taskList.Any(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName))
- {
- return (false,
- new
- {
- status = false,
- msg = $"浣滀笟:{taskOptions.TaskName},鍒嗙粍锛歿taskOptions.GroupName}宸茬粡瀛樺湪"
- });
- }
- return (true, null);
- }
-
+ /// <param name="cronExpression">Cron琛ㄨ揪寮�</param>
+ /// <returns>鏄惁鏈夋晥 + 閿欒淇℃伅</returns>
public static (bool, string) IsValidExpression(this string cronExpression)
{
try
{
- CronTriggerImpl trigger = new CronTriggerImpl();
+ // 閫氳繃Quartz鍐呯疆鐨凜ronTriggerImpl楠岃瘉琛ㄨ揪寮�
+ var trigger = new CronTriggerImpl();
trigger.CronExpressionString = cronExpression;
- DateTimeOffset? date = trigger.ComputeFirstFireTimeUtc(null);
- return (date != null, date == null ? $"璇风‘璁よ〃杈惧紡{cronExpression}鏄惁姝g‘!" : "");
+ // 璁$畻绗竴涓Е鍙戞椂闂达細null琛ㄧず琛ㄨ揪寮忔棤鏁�
+ var date = trigger.ComputeFirstFireTimeUtc(null);
+ return (date != null, date == null ? $"琛ㄨ揪寮弡cronExpression}鏃犳晥!" : string.Empty);
}
catch (Exception e)
{
- return (false, $"璇风‘璁よ〃杈惧紡{cronExpression}鏄惁姝g‘!{e.Message}");
+ return (false, $"琛ㄨ揪寮弡cronExpression}鏃犳晥!{e.Message}");
}
}
- }
+ /// <summary>
+ /// 浠嶫ob鎵ц涓婁笅鏂囪幏鍙栦换鍔¢厤缃�
+ /// 鐢ㄤ簬Job鎵ц鏃惰幏鍙栨渶鏂扮殑浠诲姟鍙傛暟
+ /// </summary>
+ /// <param name="context">Job鎵ц涓婁笅鏂�</param>
+ /// <returns>浠诲姟閰嶇疆椤�</returns>
+ public static TaskOptions GetTaskOptions(this IJobExecutionContext context)
+ {
+ var jobKey = context.JobDetail.Key;
+ // 浠庡唴瀛樺垪琛ㄤ腑鑾峰彇鍖归厤鐨勪换鍔★紙Job鎵ц鏃朵紭鍏堢敤鍐呭瓨锛屽噺灏戞暟鎹簱鏌ヨ锛�
+ return _taskList.FirstOrDefault(x => x.TaskName == jobKey.Name && x.GroupName == jobKey.Group);
+ }
+ }
}
--
Gitblit v1.9.3