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