zhaolei
8 days ago 4a2e5b9a21940f11757be37d99f0944e240e908b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Prow.Tasks
{
    /// <summary>
    /// 内部默认任务调度类
    /// </summary>
    internal class DefaultScheduler : IScheduler
    {
        /// <summary>
        /// 获得/设置 下一次运行时间 为空时表示不再运行
        /// </summary>
        public DateTimeOffset? NextRuntime { get => Status == SchedulerStatus.Running ? Triggers.Where(t => t.Enabled && t.NextRuntime != null).Min(t => t.NextRuntime) : null; }
 
        /// <summary>
        /// 获得/设置 上一次运行时间 为空时表示未运行
        /// </summary>
        public DateTimeOffset? LastRuntime { get { return SchedulerProcess?.Triggers.Select(t => t.Trigger.LastRuntime).Max(); } }
 
        /// <summary>
        /// 获得/设置 上一次任务运行结果
        /// </summary>
        public TriggerResult LastRunResult { get { return SchedulerProcess?.Triggers.FirstOrDefault(t => t.Trigger.LastRuntime == LastRuntime).Trigger.LastResult ?? TriggerResult.Error; } }
 
        /// <summary>
        /// 获得/设置 调度器创建时间
        /// </summary>
        public DateTimeOffset CreatedTime { get; } = DateTimeOffset.Now;
 
        /// <summary>
        /// 获得/设置 任务调度名称
        /// </summary>
        public string Name { get; set; }
 
        /// <summary>
        /// 获得/设置 调度器相关触发器
        /// </summary>
        public IEnumerable<ITrigger> Triggers { get { return SchedulerProcess?.Triggers.Select(t => t.Trigger) ?? new DefaultTrigger[0]; } }
 
        /// <summary>
        /// 获得/设置 调度处理器实例
        /// </summary>
        public SchedulerProcess? SchedulerProcess { get; set; }
 
        /// <summary>
        /// 获得/设置 调度器相关联任务实例
        /// </summary>
        public ITask? Task { get; set; }
 
        /// <summary>
        /// 获得/设置 任务调度状态
        /// </summary>
        public SchedulerStatus Status
        {
            get => SchedulerProcess?.Status ?? SchedulerStatus.Disabled;
            set
            {
                if (SchedulerProcess != null && SchedulerProcess.Status != value)
                {
                    SchedulerProcess.Status = value;
                    SchedulerProcess.LoggerAction($"{nameof(Tasks.SchedulerProcess)} SchedulerStatus({value})");
                    if (value == SchedulerStatus.Running)
                    {
                        // 运行调度
                        SchedulerProcess.Start();
                    }
                    else
                    {
                        // 停止调度
                        SchedulerProcess.Stop();
                    }
                }
            }
        }
 
        /// <summary>
        /// 获得/设置 上一次错误信息
        /// </summary>
        public Exception? Exception { get; set; }
 
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name"></param>
        public DefaultScheduler(string name) => Name = name;
    }
}