2881099 / FreeScheduler

轻量化定时任务调度,支持集群、临时的延时任务和重复循环任务(可持久化),可按秒,每天/每周/每月固定时间,自定义间隔执行,支持 .NET Core 2.1+、.NET Framework 4.0+ 运行环境。
303 stars 50 forks source link

OnExecuted 是不是无法重写 #20

Open alanchen78 opened 1 year ago

alanchen78 commented 1 year ago

public void OnExecuted(Scheduler scheduler, TaskInfo task, TaskLog result) { _fsql.Transaction(() => { _fsql.Update().NoneParameter().SetSource(task) .UpdateColumns(a => new { a.CurrentRound, a.ErrorTimes, a.LastRunTime, a.Status }) .ExecuteAffrows(); _fsql.Insert().NoneParameter().AppendData(result).ExecuteAffrows(); }); }

2881099 commented 1 year ago

FreeSqlHandler 定义不复杂,可以考虑在完整实现上修改,如下:

    public class MyFreeSqlHandler : ITaskHandler
    {
        IFreeSql _fsql;
        public FreeSqlHandler(IFreeSql fsql)
        {
            _fsql = fsql;
            // 此处使用 Aop 设置实体,外部可通过 FluentApi 复盖重新设置新值
            _fsql.Aop.ConfigEntity += (_, e) =>
            {
                if (e.EntityType == typeof(TaskInfo)) e.ModifyResult.Name = "FreeScheduler_task";
                if (e.EntityType == typeof(TaskLog)) e.ModifyResult.Name = "FreeScheduler_tasklog";
            };
            _fsql.Aop.ConfigEntityProperty += (_, e) =>
            {
                if (e.EntityType == typeof(TaskInfo))
                {
                    switch (e.Property.Name)
                    {
                        case nameof(TaskInfo.Id): e.ModifyResult.IsPrimary = true; break;
                        case nameof(TaskInfo.Body): e.ModifyResult.StringLength = -1; break;
                        case nameof(TaskInfo.Interval): e.ModifyResult.MapType = typeof(string); break;
                        case nameof(TaskInfo.IntervalArgument): e.ModifyResult.StringLength = 1024; break;
                        case nameof(TaskInfo.Status): e.ModifyResult.MapType = typeof(string); break;
                    }
                }
                else if (e.EntityType == typeof(TaskLog))
                {
                    switch (e.Property.Name)
                    {
                        case nameof(TaskLog.Exception): e.ModifyResult.StringLength = -1; break;
                        case nameof(TaskLog.Remark): e.ModifyResult.StringLength = -1; break;
                    }
                }
            };
            _fsql.CodeFirst.SyncStructure<TaskInfo>();
            _fsql.CodeFirst.SyncStructure<TaskLog>();
        }

        public IEnumerable<TaskInfo> LoadAll() => _fsql.Select<TaskInfo>().Where(a => a.Status == TaskStatus.Running && (a.Round < 0 || a.CurrentRound < a.Round)).ToList();
        public TaskInfo Load(string id) => _fsql.Select<TaskInfo>().Where(a => a.Id == id).First();
        public void OnAdd(TaskInfo task) => _fsql.Insert<TaskInfo>().NoneParameter().AppendData(task).ExecuteAffrows();
        public void OnRemove(TaskInfo task) => _fsql.Delete<TaskInfo>().Where(a => a.Id == task.Id).ExecuteAffrows();
        public void OnExecuted(Scheduler scheduler, TaskInfo task, TaskLog result)
        {
            _fsql.Transaction(() =>
            {
                _fsql.Update<TaskInfo>().NoneParameter().SetSource(task)
                    .UpdateColumns(a => new { a.CurrentRound, a.ErrorTimes, a.LastRunTime, a.Status })
                    .ExecuteAffrows();
                _fsql.Insert<TaskLog>().NoneParameter().AppendData(result).ExecuteAffrows();
            });
        }

        public virtual void OnExecuting(Scheduler scheduler, TaskInfo task)
        {
            Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss")}] {task.Topic} 被执行,还剩 {scheduler.QuantityTask} 个循环任务");
        }
    }