Tiger.Business/Services/Base/InterfaceService.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Tiger.Business/Services/Base/InterfaceServiceNew.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Tiger.Business/Services/ServicesBus.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Tiger.Dependencies/Tiger.Dependencies.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Tiger.IBusiness/Service/IInterfaceService.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Tiger.Business/Services/Base/InterfaceService.cs
@@ -1,10 +1,10 @@ using 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}]正在运行不能编辑"; @@ -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(); } } } Tiger.Business/Services/Base/InterfaceServiceNew.cs
@@ -1,6 +1,6 @@ using Newtonsoft.Json; using 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}]正在运行不能编辑"; @@ -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(); // 声明一个Registry类 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 } } 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); } } 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" /> 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(); } } 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; } } } 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, } } }