服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2024-10-25 7febfae83ccb8c1d927a817145fc9c99d173f222
计划任务更新,用FluentScheduler
已修改7个文件
301 ■■■■ 文件已修改
Tiger.Business/Services/Base/InterfaceService.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/Services/Base/InterfaceServiceNew.cs 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/Services/ServicesBus.cs 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Dependencies/Tiger.Dependencies.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness/Service/IInterfaceService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | 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,
        }
    }
}