服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
7 天以前 bdf6174b1065a24877f16bba68921772a9586b48
Tiger.Business/Services/Base/InterfaceServiceNew.cs
@@ -1,10 +1,12 @@
using FluentScheduler;
using Newtonsoft.Json;
using Rhea.Common;
using Sundial;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
@@ -277,25 +279,29 @@
            SaveRunningStatus(); //保存状态
        }
        private void SaveRunningStatus() {
            TSK_TRIG trig = new TSK_TRIG();
        private void SaveRunningStatus()
        {
            List<TSK_TRIG> listTrig = new List<TSK_TRIG>();
            foreach (var schedule in JobManager.RunningSchedules)
            {
                var job = Biz.Db.Queryable<TSK_JOB>().Where(q => q.JobName == schedule.Name).First();
                if (job != null)
                {
                    TSK_TRIG trig = new TSK_TRIG();
                    trig = Biz.Db.Queryable<TSK_TRIG>().Where(q => q.JobId == job.ID).First();
                    trig.Status = TSK_TRIG.Statuss.Running.GetValue();
                    trig.StartTime = DateTime.Now;
                    trig.NextRunTime = schedule.NextRun;
                    listTrig.Add(trig);
                }
            }
            var db = Biz.Db;
            //保存到数据库
            var dbTran = db.UseTran(() =>
            {
                if (trig != null)
                if (listTrig.Count > 0)
                {
                    db.Updateable(trig, "system").UpdateColumns(q => new { q.Status, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand();
                    db.Updateable(listTrig, "system").UpdateColumns(q => new { q.Status, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand();
                }
            });
            if (!dbTran.IsSuccess)
@@ -311,58 +317,67 @@
        /// <param name="newEntity"></param>
        /// <param name="jobParam"></param>
        /// <returns></returns>
        public ApiAction AddJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, ITJob
        public ApiAction AddTskJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, ITJob
        {
            ApiAction apiAction = new();
            try
            {
                JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(typeof(TJob).Name)));
                string guid = Guid.NewGuid().ToString("N");
                var trigger = new TSK_TRIG()
                if (!JobManager.AllSchedules.Any(q => q.Name == jobParam.JobName))
                {
                    JobId = guid,
                    Args = JsonConvert.SerializeObject(jobParam.Args),
                    Status = TSK_TRIG.Statuss.Running.GetValue(),
                    StartTime = DateTime.Now,
                    NumberOfRuns = 1,
                };
                TSK_JOB job = new()
                {
                    ID = guid,
                    Remark = jobParam.Remark,
                    JobType = typeof(TJob).Name,
                    AssemblyName = jobParam.AssemblyName,
                    JobName = jobParam.JobName,
                };
                if (Biz.Db.Queryable<TSK_JOB>().Any(q=>q.JobName == typeof(TJob).Name)) {
                    apiAction.IsSuccessed = false;
                    apiAction.LocaleMsg = new($"任务已经存在");
                    return apiAction;
                }
                var db = Biz.Db;
                //保存到数据库
                var dbTran = db.UseTran(() =>
                {
                    if (job != null)
                    JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(jobParam.JobName)));
                    string guid = Guid.NewGuid().ToString("N");
                    if (Biz.Db.Queryable<TSK_JOB>().Any(x =>
                    (x.JobName != jobParam.JobName && x.JobType == jobParam.DataType) ||
                    (x.JobName == jobParam.JobName && x.JobType != jobParam.DataType)))
                    {
                        db.Insertable(job, "system").ExecuteCommand();
                        apiAction.IsSuccessed = false;
                        apiAction.LocaleMsg = new($"相同的类名不能有不同的任务名或者相同的任务名不能有不同的类名");
                        return apiAction;
                    }
                    if (trigger != null)
                    TSK_JOB job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == jobParam.JobName && x.JobType == jobParam.DataType).First() ?? new()
                    {
                        db.Insertable(trigger, "system").ExecuteCommand();
                        ID = guid,
                    };
                    job.Remark = jobParam.Remark;
                    job.JobType = jobParam.DataType;
                    job.AssemblyName = jobParam.AssemblyName;
                    job.JobName = jobParam.JobName;
                    var trigger = Biz.Db.Queryable<TSK_TRIG>().Where(x => x.JobId == job.ID).First() ?? new TSK_TRIG()
                    {
                        JobId = guid,
                        StartTime = DateTime.Now,
                        NumberOfRuns = 1,
                    };
                    trigger.Args = JsonConvert.SerializeObject(jobParam.Args);
                    trigger.Status = TSK_TRIG.Statuss.Running.GetValue();
                    var db = Biz.Db;
                    //保存到数据库
                    var dbTran = db.UseTran(() =>
                    {
                        var y = db.Storageable(job)
                           .WhereColumns(t => new { t.JobName,t.JobType, t.GHOST_ROW })
                           .ToStorage();
                        y.AsInsertable.ExecuteCommand();
                        y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand();
                        var z = db.Storageable(trigger)
                           .WhereColumns(t => new { t.JobId, t.GHOST_ROW })
                           .ToStorage();
                        z.AsInsertable.ExecuteCommand();
                        z.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand();
                    });
                    if (!dbTran.IsSuccess)
                    {
                        apiAction.CatchExceptionWithLog(dbTran.ErrorException, $"添加工作任务时保存到数据库异常");
                    }
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Scheduler.Trace(dbTran.ErrorException, $"添加工作任务时保存到数据库异常");
                }
                //apiAction.Data = entity;
            }
            catch (System.Exception ex)
            {
                Logger.Console.Fatal(ex, "Add Job From DB Exception");
                apiAction.CatchExceptionWithLog(ex);
            }
            if (!apiAction.IsSuccessed) { JobManager.RemoveJob(jobParam.JobName); }
            return apiAction;
        }
@@ -372,6 +387,23 @@
        /// <param name="jobname"></param>
        public void RemovefJob(string jobname)
        {
            if (JobManager.AllSchedules.Any(q => q.Name == jobname))
            {
                string guid = Guid.NewGuid().ToString("N");
                TSK_JOB job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == jobname).First();
                var trigger = Biz.Db.Queryable<TSK_TRIG>().Where(x => x.JobId == job.ID).First();
                trigger.Status = TSK_TRIG.Statuss.Stop.GetValue();
                var db = Biz.Db;
                //保存到数据库
                var dbTran = db.UseTran(() =>
                {
                    db.Updateable(trigger, "system_job").UpdateColumns(q=>new { q.Status,q.UPDATE_TIME,q.UPDATE_USER}).ExecuteCommand();
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Scheduler.Fatal(dbTran.ErrorException, $"添加工作任务时保存到数据库异常");
                }
            }
            JobManager.RemoveJob(jobname);
        }
@@ -412,7 +444,7 @@
        /// <returns></returns>
        private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, ITJob
        {
            return registry.Schedule<TJob>().WithName(typeof(TJob).Name);
            return registry.Schedule<TJob>().WithName(JobName);
        }
        /// <summary>
@@ -484,7 +516,7 @@
                    }
                    break;
                case TrigArgs.EveryType.Weekdays:
                    if (args.Hours > 0 )
                    if (args.Hours > 0)
                    {
                        timeUnit.Weekdays().At(args.Hours, args.Minutes);
                    }
@@ -494,7 +526,7 @@
                    }
                    break;
                case TrigArgs.EveryType.Months:
                    if (args.Days>0 && args.Hours > 0)
                    if (args.Days > 0 && args.Hours > 0)
                    {
                        timeUnit.Months().On(args.Days).At(args.Hours, args.Minutes);
                    }
@@ -507,6 +539,47 @@
        }
        /// <summary>
        /// 立即运行
        /// </summary>
        /// <param name="jobname"></param>
        public ApiAction ImmediateRun<TJob>(TJob newEntity, string jobname) where TJob : class, ITJob
        {
            ApiAction apiAction = new();
            try
            {
                if (JobManager.AllSchedules.Any(q => q.Name == jobname))
                {
                    JobManager.RemoveJob(jobname);
                    string guid = Guid.NewGuid().ToString("N");
                    TSK_JOB job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == jobname).IncludesAllFirstLayer().First();
                    var trigger = job.Triggers[0];
                    TrigArgs args = JsonConvert.DeserializeObject<TrigArgs>(job.Triggers[0].Args);
                    args.runType = RunType.ToRunNow;
                    JobManager.AddJob<TJob>((s) => GenerateSchedule(args, s.WithName(jobname)));
                    trigger.Status = TSK_TRIG.Statuss.Running.GetValue();
                    trigger.Args = JsonConvert.SerializeObject(args);
                    var db = Biz.Db;
                    //保存到数据库
                    var dbTran = db.UseTran(() =>
                    {
                        db.Updateable(trigger, "system_ImmediateRun_job").UpdateColumns(q => new { q.Status, q.Args, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                    });
                    if (!dbTran.IsSuccess)
                    {
                        Logger.Scheduler.Fatal(dbTran.ErrorException, $"立即运行工作任务时保存状态到数据库异常");
                    }
                    apiAction.LocaleMsg = new($"立即运行工作任务成功");
                }
            }
            catch (System.Exception ex)
            {
                apiAction.CatchExceptionWithLog(ex);
            }
            return apiAction;
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        public void Stop()