zhaolei
9 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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System;
using System.Collections.Generic;
using System.Threading;
 
namespace Prow.Tasks
{
    /// <summary>
    /// 内部默认 Trigger 仅执行一次任务
    /// </summary>
    internal class DefaultTrigger : ITrigger
    {
        private bool _enabled = true;
        /// <summary>
        /// 获得/设置 触发器是否启用
        /// </summary>
        public bool Enabled
        {
            get => _enabled;
            set
            {
                if (_enabled != value)
                {
                    _enabled = value;
                    if (!value)
                    {
                        NextRuntime = null;
                        LastResult = TriggerResult.Cancelled;
                    }
                    EnabeldChanged?.Invoke(value);
                }
            }
        }
 
        /// <summary>
        /// 获得/设置 触发器名称
        /// </summary>
        public string Name { get; set; } = "";
 
        /// <summary>
        /// 
        /// </summary>
        public Action<bool>? EnabeldChanged { get; set; }
 
        /// <summary>
        /// 获得 上次任务执行时间
        /// </summary>
        public DateTimeOffset? LastRuntime { get; set; }
 
        /// <summary>
        /// 获得/设置 任务开始时间
        /// </summary>
        public DateTimeOffset? StartTime { get; set; }
 
        /// <summary>
        /// 获得上一次运行任务耗时
        /// </summary>
        public TimeSpan LastRunElapsedTime { get; set; }
 
        /// <summary>
        /// 获得 下一次任务运行时刻
        /// </summary>
        public DateTimeOffset? NextRuntime { get; set; }
 
        /// <summary>
        /// 获得 触发器上一次结果状态
        /// </summary>
        public TriggerResult LastResult { get; set; }
 
        /// <summary>
        /// 触发器执行情况回调方法
        /// </summary>
        public Action<ITrigger>? PulseCallback { get; set; }
 
        /// <summary>
        /// 获得/设置 任务超时时间
        /// </summary>
        public TimeSpan Timeout { get; set; }
 
        /// <summary>
        /// 触发器 心跳 返回 true 时触发任务执行 同步阻塞线程方法 内部阻塞到 ITrigger 的下一次运行时间
        /// </summary>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>返回真时表示执行任务</returns>
        public virtual bool Pulse(CancellationToken cancellationToken = default)
        {
            if (LastRuntime == null)
            {
                LastRuntime = DateTimeOffset.Now;
                return true;
            }
            return false;
        }
 
        /// <summary>
        /// 重载 ToString 方法 返回 Run once trigger
        /// </summary>
        /// <returns></returns>
        public override string ToString() => "Run once trigger";
 
        /// <summary>
        /// 设置序列化属性集合方法
        /// </summary>
        /// <returns></returns>
        public virtual Dictionary<string, object> SetData() => new Dictionary<string, object>()
        {
            ["Name"] = Name,
            ["LastResult"] = LastResult,
            ["NextRuntime"] = NextRuntime?.ToString() ?? "",
            ["LastRunElapsedTime"] = LastRunElapsedTime.ToString(),
            ["StartTime"] = StartTime?.ToString() ?? "",
            ["LastRuntime"] = LastRuntime?.ToString() ?? ""
        };
 
        /// <summary>
        /// 加载序列化属性集合值方法
        /// </summary>
        /// <param name="datas"></param>
        public virtual void LoadData(Dictionary<string, object> datas)
        {
            if (datas["Name"] != null) Name = datas["Name"].ToString() ?? "";
            if (Enum.TryParse<TriggerResult>(datas["LastResult"].ToString(), out var result)) LastResult = result;
            if (TimeSpan.TryParse(datas["LastRunElapsedTime"].ToString(), out var elapsedTime)) LastRunElapsedTime = elapsedTime;
            if (DateTimeOffset.TryParse(datas["NextRuntime"]?.ToString(), out var nextRuntime)) NextRuntime = nextRuntime;
            if (NextRuntime != null && NextRuntime < DateTimeOffset.Now) NextRuntime = null;
            if (DateTimeOffset.TryParse(datas["StartTime"]?.ToString(), out var startTime)) StartTime = startTime;
            if (DateTimeOffset.TryParse(datas["LastRuntime"]?.ToString(), out var lastRuntime)) LastRuntime = lastRuntime;
        }
    }
}