服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2024-10-25 0330f4f7dd0d4fcfe3d697c3cd4712cd317718e6
计划任务更新
已修改5个文件
247 ■■■■■ 文件已修改
Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/Services/Base/InterfaceServiceNew.cs 185 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/Services/Base/TigerJobBase.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/Services/ServicesBus.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs
@@ -17,9 +17,11 @@
    /// </summary>
    public class U9C_MES_GetWo : TigerJobBase, ITigerJob
    {
        public string Id { get; set; } = Guid.NewGuid().ToString("N");
        public string Tag { get; set; } = "U9C_MES_GetWo Interface Job";
        public string Name { get; set; } = "U9C_MES_GetWo Interface Job";
        public U9C_MES_GetWo() {
            Id = Guid.NewGuid().ToString("N");
            Tag = "U9C_MES_GetWo Interface Job";
            Name = "U9C_MES_GetWo Interface Job";
        }
        public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
        {
@@ -50,4 +52,46 @@
            await Task.CompletedTask;
        }
    }
    /// <summary>
    /// 从U9C获取工单信息 FluentScheduler版
    /// </summary>
    public class fU9C_MES_GetWo : TigerJobBase, FluentScheduler.IJob
    {
        public fU9C_MES_GetWo()
        {
            Id = Guid.NewGuid().ToString("N");
            Tag = "U9C_MES_GetWo Interface Job";
            Name = "从U9C同步工单信息";
        }
        public void Execute()
        {
            Logger.Scheduler.Info($"进入计划调度(名称:{Name})...\r\n");
            try
            {
                var _lastRunTime = Biz.SysParam["GetWo_LastRun", "Interface_LastRun"].PARAM_VALUE;
                var LastRunTime = string.IsNullOrEmpty(_lastRunTime) ? DateTime.Now.AddMinutes(-10) : Convert.ToDateTime(_lastRunTime);
                //if ((DateTime.Now - LastRunTime).TotalMinutes > 10)
                //{
                //    GetWoInput input = new GetWoInput
                //    {
                //        startTime = LastRunTime.ToString("yyyy-MM-dd HH:mm:ss"),
                //        endTime = LastRunTime.AddMinutes(10).ToString("yyyy-MM-dd HH:mm:ss")
                //    };
                //    var result = await DI.Resolve<IU9C_MES>().GetBasWo(input);
                //    if (!result.IsSuccessed)
                //    {
                //        Logger.Scheduler.Error($"获取工单信息异常:{result.Message}");
                //    }
                //}
                //SaveLog(context, "从U9C获取工单信息成功");
                Logger.Scheduler.Info($"计划调度(名称:{Name})完成\r\n");
            }
            catch (System.Exception ex)
            {
                Logger.Scheduler.Fatal(ex, "获取工单信息异常");
            }
        }
    }
}
Tiger.Business/Services/Base/InterfaceServiceNew.cs
@@ -17,7 +17,7 @@
    /// <summary>
    /// 
    /// </summary>
    public class InterfaceServiceNew: IInterfaceService
    public class InterfaceServiceNew : IInterfaceService
    {
        #region Sundial计划调度 旧版本使用
@@ -40,7 +40,7 @@
        public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, Sundial.IJob
        {
            ApiAction apiAction = new();
            Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period*60*1000).LoadFrom(new
            Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new
            {
                TriggerId = jobParam.JobName + "_trigger1",
            });
@@ -203,20 +203,20 @@
        {
            try
            {
                var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList();
                foreach (var job in jobs)
                {
                    Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true);
                    _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(() =>
                        {
                            Thread.Sleep(2000);
                            PauseJob(job.JobName);
                        });
                    }
                }
                var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList();
                foreach (var job in jobs)
                {
                    Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true);
                    _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(() =>
                        {
                            Thread.Sleep(2000);
                            PauseJob(job.JobName);
                        });
                    }
                }
            }
            catch (System.Exception ex)
            {
@@ -266,10 +266,10 @@
        /// </summary>
        public void JobInitialize()
        {
            JobManager.Initialize();
            JobManager.Initialize(AddJobsFromDB());
            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})");
            JobManager.JobStart += info => Logger.Scheduler.Info($"{info.Name}: started\r\n");
            JobManager.JobEnd += info => Logger.Scheduler.Info($"{info.Name}: ended ({info.Duration})\r\n");
        }
        /// <summary>
@@ -284,7 +284,8 @@
            ApiAction apiAction = new();
            try
            {
                JobManager.AddJob<TJob>((s) => s.ToRunEvery(5).Seconds());
                JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(jobParam.JobName)));
                //Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new
                //{
                //    TriggerId = jobParam.JobName + "_trigger1",
@@ -311,85 +312,28 @@
        /// <summary>
        /// 从数据库批量添加任务
        /// </summary>
        public void AddJobsFromDB()
        public Registry AddJobsFromDB()
        {
            // 声明一个Registry类
            var registry = new Registry();
            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;
                    }
                    Schedule schedule = Schedule(_type, job.JobName, registry);
                    //生成计划
                    GenerateSchedule(args, schedule);
                }
            }
            catch (System.Exception ex)
            {
                Logger.Console.Fatal(ex, "Add Job From DB Exception");
            }
            return registry;
        }
        /// <summary>
@@ -406,6 +350,76 @@
        }
        /// <summary>
        /// 生成计划
        /// </summary>
        /// <param name="args"></param>
        /// <param name="schedule"></param>
        private void GenerateSchedule(TrigArgs args, Schedule schedule)
        {
            SpecificTimeUnit specificTimeUnit = null;
            TimeUnit timeUnit = null;
            if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); }
            if (args.ToRunNow == "Y") { specificTimeUnit = schedule.ToRunNow(); }
            if (args.ToRunOnceAt == "Y") { specificTimeUnit = schedule.ToRunOnceAt(args.ToRunOnceAtDt.AddMinutes(args.NowAddMinutes)); }
            if (args.ToRunOnceIn > 0) { timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); }
            else if (args.ToRunEvery >= 0) { timeUnit = schedule.ToRunEvery(args.ToRunEvery); }
            if (specificTimeUnit != null && args.AndEvery>0) { timeUnit = specificTimeUnit.AndEvery(args.AndEvery); }
            //按时间类型来运行
            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;
            }
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        public void Stop()
@@ -416,7 +430,8 @@
        /// <summary>
        /// 在任务完成后等待或者停止
        /// </summary>
        public void StopAndBlock() {
        public void StopAndBlock()
        {
            JobManager.StopAndBlock();
        }
Tiger.Business/Services/Base/TigerJobBase.cs
@@ -11,9 +11,9 @@
    /// </summary>
    public class TigerJobBase
    {
        public string Id { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public string Tag { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public string Name { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public string Id { get; set; }
        public string Tag { get; set; }
        public string Name { get; set; }
        /// <summary>
        /// 保存日志
Tiger.Business/Services/ServicesBus.cs
@@ -20,7 +20,7 @@
        {
            if (ApiConfig.RunInterface)
            {
                //BizContext.InterfaceService = DI.Resolve<IInterfaceService>();
                BizContext.InterfaceService = DI.Resolve<IInterfaceService>();
                //BizContext.InterfaceService.SetSchedulerFactory(schedulerFactory);
                ////启动时从服务器加载所有作业
                //BizContext.InterfaceService.AddJobFromDB();
Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs
@@ -183,6 +183,10 @@
    public class TrigArgs
    {
        public string ToRunNow { get; set; }
        public string ToRunOnceAt { get; set; }
        public DateTime ToRunOnceAtDt { get; set; }
        public int NowAddMinutes { get; set; }
        public int AndEvery { get; set; }
        public int ToRunEvery { get; set; }
        public int ToRunOnceIn { get; set; }
        public string NonReentrant { get; set; } //Y不重复,N重复