/
entity.go
79 lines (61 loc) · 1.3 KB
/
entity.go
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
package cron
import (
"container/heap"
"time"
)
// Entity 保存下一次和这次的运行时间
type Entity struct {
ID int64
Task Tasker
// Prev 待执行时间
Prev time.Time
// next 下一次执行时间
next time.Time
}
// Done 调整执行时间
func (entity *Entity) Done() {
entity.Prev = entity.next
entity.next = entity.Task.Next(entity.Prev)
}
// Entities 保存所有 Entity 用于排序
type Entities struct {
data []*Entity
num int
}
var (
_ heap.Interface = (*Entities)(nil)
)
func (e Entities) Len() int {
return e.num
}
func (e Entities) Less(i, j int) bool {
return e.data[i].Prev.Before(e.data[j].Prev)
}
func (e Entities) Swap(i, j int) {
e.data[i], e.data[j] = e.data[j], e.data[i]
}
func (e *Entities) Pop() interface{} {
e.num--
return e.data[e.Len()]
}
func (e *Entities) Push(v interface{}) {
entity := v.(*Entity)
entity.next = entity.Task.Next(entity.Prev)
e.num++
e.data = append(e.data, entity)
}
// Remove 从队列中删除
func (e *Entities) Remove() {
e.data = append(e.data[:e.Len()], e.data[e.Len()+1:]...)
}
// Reset 重新排列队列
func (e *Entities) Reset() time.Time {
if e.num == 0 {
e.num = len(e.data)
}
heap.Init(e)
if e.Len() == 0 {
return time.Now().AddDate(15, 0, 0) // 等待添加任务
}
return e.data[e.Len()-1].Prev
}