From 7febfae83ccb8c1d927a817145fc9c99d173f222 Mon Sep 17 00:00:00 2001 From: Ben Lin <maobin001@msn.com> Date: 星期五, 25 十月 2024 00:03:15 +0800 Subject: [PATCH] 计划任务更新,用FluentScheduler --- Tiger.Business/Services/ServicesBus.cs | 28 +--- Tiger.IBusiness/Service/IInterfaceService.cs | 1 Tiger.Business/Services/Base/InterfaceService.cs | 30 ++-- Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs | 36 ++++++ Tiger.Business/Services/Base/InterfaceServiceNew.cs | 196 ++++++++++++++++++++++++++++++-- Tiger.Dependencies/Tiger.Dependencies.csproj | 1 Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs | 9 + 7 files changed, 251 insertions(+), 50 deletions(-) diff --git a/Tiger.Business/Services/Base/InterfaceService.cs b/Tiger.Business/Services/Base/InterfaceService.cs index 90edc20..8dc4a88 100644 --- a/Tiger.Business/Services/Base/InterfaceService.cs +++ b/Tiger.Business/Services/Base/InterfaceService.cs @@ -1,10 +1,10 @@ 锘縰sing Apache.NMS.ActiveMQ.Threads; +using FluentScheduler; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Rhea.Common; using SqlSugar; -using Sundial; using System; using System.Collections; using System.Collections.Generic; @@ -15,7 +15,6 @@ using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; -using static System.Collections.Specialized.BitVector32; namespace Tiger.Business { @@ -24,12 +23,12 @@ /// </summary> public class InterfaceService: IInterfaceService { - public ISchedulerFactory _schedulerFactory { get; set; } + public Sundial.ISchedulerFactory _schedulerFactory { get; set; } /// <summary> /// 璁剧疆璁″垝浠诲姟宸ュ巶绫� /// </summary> /// <param name="schedulerFactory"></param> - public void SetSchedulerFactory(ISchedulerFactory schedulerFactory) + public void SetSchedulerFactory(Sundial.ISchedulerFactory schedulerFactory) { _schedulerFactory = schedulerFactory; } @@ -40,10 +39,10 @@ /// <typeparam name="TJob"></typeparam> /// <param name="newEntity"></param> /// <param name="jobParam"></param> - public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, IJob + public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); - TriggerBuilder triggerBuilder = Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new + Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new { TriggerId = jobParam.JobName + "_trigger1", }); @@ -57,7 +56,7 @@ /// <typeparam name="TJob"></typeparam> /// <param name="jobname"></param> /// <param name="triggerBuilders"></param> - public ApiAction AddJob<TJob>(string jobname, params TriggerBuilder[] triggerBuilders) where TJob : class, IJob + public ApiAction AddJob<TJob>(string jobname, params Sundial.TriggerBuilder[] triggerBuilders) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); triggerBuilders[0].LoadFrom(new @@ -77,9 +76,9 @@ public ApiAction UpdateJob(TSK_JOB job) { ApiAction apiAction = new ApiAction(); - IScheduler scheduler = GetJob(job.JobName); + Sundial.IScheduler scheduler = GetJob(job.JobName); var trigger = scheduler.GetTrigger($"{job.JobName}_trigger1"); - if (trigger.Status == TriggerStatus.Running) + if (trigger.Status == Sundial.TriggerStatus.Running) { apiAction.IsSuccessed = false; apiAction.Message = $"浣滀笟[{job.JobName}]姝e湪杩愯涓嶈兘缂栬緫"; @@ -114,7 +113,7 @@ public void StartJob(string jobname) { // 甯﹁繑鍥炲�� - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryRunJob(jobname, out scheduler); } @@ -123,9 +122,9 @@ /// </summary> /// <param name="jobname"></param> /// <returns></returns> - public IScheduler GetJob(string jobname) + public Sundial.IScheduler GetJob(string jobname) { - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryGetJob(jobname, out scheduler); return scheduler; } @@ -134,7 +133,7 @@ /// 鑾峰彇鎵�鏈変綔涓� /// </summary> /// <returns></returns> - public List<IScheduler> GetJobs() + public List<Sundial.IScheduler> GetJobs() { return _schedulerFactory.GetJobs().ToList(); } @@ -171,5 +170,10 @@ { ; } + + public void JobInitialize() + { + JobManager.Initialize(); + } } } diff --git a/Tiger.Business/Services/Base/InterfaceServiceNew.cs b/Tiger.Business/Services/Base/InterfaceServiceNew.cs index ec9be57..04ebaa3 100644 --- a/Tiger.Business/Services/Base/InterfaceServiceNew.cs +++ b/Tiger.Business/Services/Base/InterfaceServiceNew.cs @@ -1,6 +1,6 @@ -锘縰sing Newtonsoft.Json; +锘縰sing FluentScheduler; +using Newtonsoft.Json; using Rhea.Common; -using Sundial; using System; using System.Collections; using System.Collections.Generic; @@ -11,19 +11,22 @@ using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; -using static System.Collections.Specialized.BitVector32; namespace Tiger.Business { + /// <summary> + /// + /// </summary> public class InterfaceServiceNew: IInterfaceService { + #region Sundial璁″垝璋冨害 鏃х増鏈娇鐢� - public ISchedulerFactory _schedulerFactory { get; set; } + public Sundial.ISchedulerFactory _schedulerFactory { get; set; } /// <summary> /// 璁剧疆璁″垝浠诲姟宸ュ巶绫� /// </summary> /// <param name="schedulerFactory"></param> - public void SetSchedulerFactory(ISchedulerFactory schedulerFactory) + public void SetSchedulerFactory(Sundial.ISchedulerFactory schedulerFactory) { _schedulerFactory = schedulerFactory; } @@ -34,10 +37,10 @@ /// <typeparam name="TJob"></typeparam> /// <param name="newEntity"></param> /// <param name="jobParam"></param> - public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, IJob + public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); - TriggerBuilder triggerBuilder = Triggers.Period(jobParam.Period*60*1000).LoadFrom(new + Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period*60*1000).LoadFrom(new { TriggerId = jobParam.JobName + "_trigger1", }); @@ -60,7 +63,7 @@ /// <typeparam name="TJob"></typeparam> /// <param name="jobname"></param> /// <param name="triggerBuilders"></param> - public ApiAction AddJob<TJob>(string jobname, params TriggerBuilder[] triggerBuilders) where TJob : class, IJob + public ApiAction AddJob<TJob>(string jobname, params Sundial.TriggerBuilder[] triggerBuilders) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); triggerBuilders[0].LoadFrom(new @@ -84,9 +87,9 @@ public ApiAction UpdateJob(TSK_JOB job) { ApiAction apiAction = new ApiAction(); - IScheduler scheduler = GetJob(job.JobName); + Sundial.IScheduler scheduler = GetJob(job.JobName); var trigger = scheduler.GetTrigger($"{job.JobName}_trigger1"); - if (trigger.Status == TriggerStatus.Running) + if (trigger.Status == Sundial.TriggerStatus.Running) { apiAction.IsSuccessed = false; apiAction.Message = $"浣滀笟[{job.JobName}]姝e湪杩愯涓嶈兘缂栬緫"; @@ -143,7 +146,7 @@ public void StartJob(string jobname) { // 甯﹁繑鍥炲�� - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryRunJob(jobname, out scheduler); } @@ -152,9 +155,9 @@ /// </summary> /// <param name="jobname"></param> /// <returns></returns> - public IScheduler GetJob(string jobname) + public Sundial.IScheduler GetJob(string jobname) { - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryGetJob(jobname, out scheduler); return scheduler; } @@ -163,7 +166,7 @@ /// 鑾峰彇鎵�鏈変綔涓� /// </summary> /// <returns></returns> - public List<IScheduler> GetJobs() + public List<Sundial.IScheduler> GetJobs() { return _schedulerFactory.GetJobs().ToList(); } @@ -204,7 +207,7 @@ foreach (var job in jobs) { Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); - _schedulerFactory.AddJob(type, job.JobName, Triggers.Period(Convert.ToInt32(job.Triggers?[0].Args ?? "3") * 60 * 1000)); + _schedulerFactory.AddJob(type, job.JobName, Sundial.Triggers.Period(Convert.ToInt32(job.Triggers?[0].Args ?? "3") * 60 * 1000)); if (job.Triggers[0]?.Status == 3) { Work.DoAsync(() => @@ -255,5 +258,168 @@ } return action; } + #endregion + + #region 鏂扮増鏈鍒掕皟搴� FluentScheduler + /// <summary> + /// 鍒濆鍖栬鍒掕皟搴� + /// </summary> + public void JobInitialize() + { + JobManager.Initialize(); + JobManager.JobException += info => Logger.Scheduler.Error("An error just happened with a scheduled job: " + info.Exception); + JobManager.JobStart += info => Logger.Scheduler.Info($"{info.Name}: started"); + JobManager.JobEnd += info => Logger.Scheduler.Info($"{info.Name}: ended ({info.Duration})"); + } + + /// <summary> + /// 娣诲姞宸ヤ綔浠诲姟 + /// </summary> + /// <typeparam name="TJob"></typeparam> + /// <param name="newEntity"></param> + /// <param name="jobParam"></param> + /// <returns></returns> + public ApiAction AddJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, IJob + { + ApiAction apiAction = new(); + try + { + JobManager.AddJob<TJob>((s) => s.ToRunEvery(5).Seconds()); + //Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new + //{ + // TriggerId = jobParam.JobName + "_trigger1", + //}); + //_schedulerFactory.AddJob<TJob>(jobParam.JobName, triggerBuilder); + //var trigger = GetJob(jobParam.JobName).GetTrigger($"{jobParam.JobName}_trigger1"); + //TSK_JOB entity = ReturnDetail(jobParam.JobName); + //entity.Remark = jobParam.Remark; + //entity.JobType = typeof(TJob).Name; + //entity.JobName = jobParam.JobName; + //entity.TriggersWithGhost = new List<TSK_TRIG> { JsonConvert.DeserializeObject<TSK_TRIG>(JsonConvert.SerializeObject(trigger)) }; + //entity.Triggers[0].Args = jobParam.Period.ToString(); + //apiAction = SaveJob(entity); + //apiAction.Data = entity; + + } + catch (System.Exception ex) + { + Logger.Console.Fatal(ex, "Add Job From DB Exception"); + } + return apiAction; + } + + /// <summary> + /// 浠庢暟鎹簱鎵归噺娣诲姞浠诲姟 + /// </summary> + public void AddJobsFromDB() + { + try + { + var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList(); + // 澹版槑涓�涓猂egistry绫� + var registry = new Registry(); + foreach (var job in jobs) + { + Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); + dynamic _type = Activator.CreateInstance(type); + TrigArgs args = JsonConvert.DeserializeObject<TrigArgs>(job.Triggers[0].Args); + Schedule schedule = Schedule(_type,job.JobName, registry); + SpecificTimeUnit specificTimeUnit = null; + TimeUnit timeUnit = null; + if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); } + if (args.ToRunNow == "Y") { specificTimeUnit = schedule.ToRunNow(); } + if (args.ToRunOnceIn > 0) { timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); } + else if (args.ToRunEvery >= 0) { timeUnit = schedule.ToRunEvery(args.ToRunEvery); } + //鎸夋椂闂寸被鍨嬫潵杩愯 + switch (args.Type) + { + case TrigArgs.EveryType.Milliseconds: + timeUnit.Milliseconds(); + break; + case TrigArgs.EveryType.Seconds: + timeUnit.Seconds(); + break; + case TrigArgs.EveryType.Minutes: + timeUnit.Minutes(); + break; + case TrigArgs.EveryType.Hours: + if (args.Minutes > 0) + { + timeUnit.Hours().At(args.Minutes); + } + else + { + timeUnit.Hours(); + } + break; + case TrigArgs.EveryType.Days: + if (args.Hours>0 && args.Minutes > 0 ) + { + timeUnit.Days().At(args.Hours, args.Minutes); + } + else + { + timeUnit.Days(); + } + break; + case TrigArgs.EveryType.Weeks: + if (args.Hours > 0 && args.Minutes > 0) + { + timeUnit.Weeks().At(args.Hours, args.Minutes); + } + else + { + timeUnit.Weeks(); + } + break; + case TrigArgs.EveryType.Weekdays: + if (args.Hours > 0 && args.Minutes > 0) + { + timeUnit.Weekdays().At(args.Hours, args.Minutes); + } + else + { + timeUnit.Weekdays(); + } + break; + } + + } + } + catch (System.Exception ex) + { + Logger.Console.Fatal(ex, "Add Job From DB Exception"); + } + } + + /// <summary> + /// 鏍规嵁瀹炰綋鍚嶆敞鍐岃鍒� + /// </summary> + /// <typeparam name="TJob"></typeparam> + /// <param name="entity"></param> + /// <param name="JobName"></param> + /// <param name="registry"></param> + /// <returns></returns> + private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, IJob + { + return registry.Schedule<TJob>().WithName(JobName); + } + + /// <summary> + /// 鍋滄鏈嶅姟 + /// </summary> + public void Stop() + { + JobManager.Stop(); + } + + /// <summary> + /// 鍦ㄤ换鍔″畬鎴愬悗绛夊緟鎴栬�呭仠姝� + /// </summary> + public void StopAndBlock() { + JobManager.StopAndBlock(); + } + + #endregion } } diff --git a/Tiger.Business/Services/ServicesBus.cs b/Tiger.Business/Services/ServicesBus.cs index 96d6428..2512b3c 100644 --- a/Tiger.Business/Services/ServicesBus.cs +++ b/Tiger.Business/Services/ServicesBus.cs @@ -20,30 +20,14 @@ { if (ApiConfig.RunInterface) { - BizContext.InterfaceService = DI.Resolve<IInterfaceService>(); - BizContext.InterfaceService.SetSchedulerFactory(schedulerFactory); - //鍚姩鏃朵粠鏈嶅姟鍣ㄥ姞杞芥墍鏈変綔涓� - BizContext.InterfaceService.AddJobFromDB(); + //BizContext.InterfaceService = DI.Resolve<IInterfaceService>(); + //BizContext.InterfaceService.SetSchedulerFactory(schedulerFactory); + ////鍚姩鏃朵粠鏈嶅姟鍣ㄥ姞杞芥墍鏈変綔涓� + //BizContext.InterfaceService.AddJobFromDB(); + //鏂扮増鏈鍒掕皟璇曞垵濮嬪寲 + BizContext.InterfaceService.JobInitialize(); - //BizContext.InterfaceService.AddJob(); - - //BizContext.InterfaceService.AddJob<Jobs.QqtSrmToXCSJJob>("XCSJ_QqtRM_Supplier_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("XCSJ_QqtRM_Supplier_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.QqtSrmToDGXCJob>("DGXC_QqtRM_Supplier_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("DGXC_QqtRM_Supplier_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.QqtSrmToAHXCJob>("AHXC_QqtRM_Supplier_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("AHXC_QqtRM_Supplier_Interface"); - - - //BizContext.InterfaceService.AddJob<Jobs.ReceiptHToErpXCSJJob>("XCSJ_ReceiptHToErp_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("XCSJ_ReceiptHToErp_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.ReceiptHToErpDGXCJob>("DGXC_ReceiptHToErp_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("DGXC_ReceiptHToErp_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.ReceiptHToErpAHXCJob>("AHXC_ReceiptHToErp_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("AHXC_ReceiptHToErp_Interface"); - - //BizContext.InterfaceService.StartJob(); ConsoleExt.WriteLine("Start Interface Service..........", ConsoleColor.Yellow); } } diff --git a/Tiger.Dependencies/Tiger.Dependencies.csproj b/Tiger.Dependencies/Tiger.Dependencies.csproj index ce5e8ff..51c837f 100644 --- a/Tiger.Dependencies/Tiger.Dependencies.csproj +++ b/Tiger.Dependencies/Tiger.Dependencies.csproj @@ -13,6 +13,7 @@ <PackageReference Include="Autofac" Version="8.1.0" /> <PackageReference Include="Autofac.Configuration" Version="7.0.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" /> + <PackageReference Include="FluentScheduler" Version="5.5.1" /> <PackageReference Include="MailKit" Version="4.7.1.1" /> <PackageReference Include="NLog" Version="5.3.4" /> <PackageReference Include="NLog.Database" Version="5.3.4" /> diff --git a/Tiger.IBusiness/Service/IInterfaceService.cs b/Tiger.IBusiness/Service/IInterfaceService.cs index 4723d4b..778e283 100644 --- a/Tiger.IBusiness/Service/IInterfaceService.cs +++ b/Tiger.IBusiness/Service/IInterfaceService.cs @@ -22,5 +22,6 @@ public void PauseJob(string jobname); public void RemoveJob(string jobname); public void AddJobFromDB(); + public void JobInitialize(); } } diff --git a/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs b/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs index b74d86c..311ab70 100644 --- a/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs +++ b/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs @@ -157,4 +157,13 @@ /// </summary> public string Remark { get; set; } } + + public class FluentJobParam: TskJobParam + { + + /// <summary> + /// 鍙傛暟 + /// </summary> + public TrigArgs Args { get; set; } + } } \ No newline at end of file diff --git a/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs b/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs index 8450c34..0c7a2ab 100644 --- a/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs +++ b/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs @@ -178,4 +178,40 @@ #endregion }//endClass + + + public class TrigArgs + { + public string ToRunNow { get; set; } + public int ToRunEvery { get; set; } + public int ToRunOnceIn { get; set; } + public string NonReentrant { get; set; } //Y涓嶉噸澶嶏紝N閲嶅 + public EveryType Type { get; set; } + public Int64 Milliseconds { get; set; } + public int Seconds { get; set; } + public int Minutes { get; set; } + public int Hours { get; set; } + public int Days { get; set; } + public int Weekday { get; set; } + + public enum EveryType + { + [Description("姣")] + Milliseconds, + [Description("绉�")] + Seconds, + [Description("鍒嗛挓")] + Minutes, + [Description("灏忔椂")] + Hours, + [Description("澶�")] + Days, + [Description("鍛�")] + Weeks, + [Description("鏄熸湡鍑�")] + Weekdays, + [Description("鏈�")] + Months, + } + } } \ No newline at end of file -- Gitblit v1.9.3