package service
|
|
|
|
import (
|
|
"container/list"
|
|
)
|
|
|
|
/**调度事件队列,基于调度时间排序**/
|
|
|
|
// 调度任务队列对象
|
|
type SchedQueue struct {
|
|
taskList *list.List
|
|
}
|
|
|
|
// 初始化构造一个新的任务队列对象
|
|
func NewSchedQueue() *SchedQueue {
|
|
return &SchedQueue{
|
|
taskList: list.New(),
|
|
}
|
|
}
|
|
|
|
// 返回队列存储的节点数量
|
|
func (q *SchedQueue) Length() int {
|
|
return q.taskList.Len()
|
|
}
|
|
|
|
// 将元素从队列尾部加入队列
|
|
func (q *SchedQueue) AddBack(event SchedEvent) {
|
|
q.taskList.PushBack(event)
|
|
}
|
|
|
|
// 将元素从队列头部加入队列
|
|
func (q *SchedQueue) AddFront(event SchedEvent) {
|
|
q.taskList.PushFront(event)
|
|
}
|
|
|
|
// 基于时间点将元素插入队列
|
|
func (q *SchedQueue) Insert(event SchedEvent) {
|
|
var(
|
|
elem *list.Element
|
|
et SchedEvent
|
|
prioEvent, prioElem int
|
|
binsert bool
|
|
)
|
|
|
|
// 从头遍历,比较时间并插入
|
|
binsert = false
|
|
for elem = q.taskList.Front(); elem != nil; elem = elem.Next() {
|
|
et = (elem.Value).(SchedEvent)
|
|
// 时间时间点早于比较时间的时间点,则插入到其前方
|
|
if event.GetEventTime().Unix() < et.GetEventTime().Unix() {
|
|
q.taskList.InsertBefore(event, elem)
|
|
binsert = true
|
|
break
|
|
}
|
|
// 如果相等,则比较事件对象的优先级,优先级高则插入
|
|
if event.GetEventTime().Unix() == et.GetEventTime().Unix() {
|
|
prioEvent = GetSchedEventTypePriority(event.GetEventType())
|
|
prioElem = GetSchedEventTypePriority(et.GetEventType())
|
|
if prioEvent > prioElem{
|
|
q.taskList.InsertBefore(event, elem)
|
|
binsert = true
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// 没有找到插入点,则默认插入到队列尾部
|
|
if !binsert {
|
|
q.AddBack(event)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 返回队头元素,但元素不出队
|
|
func (q *SchedQueue) Front() (event *SchedEvent) {
|
|
if q.Length() > 0 {
|
|
elem := q.taskList.Front()
|
|
res := (elem.Value).(SchedEvent)
|
|
event = &res
|
|
return
|
|
}else{
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// 返回队头元素,元素出队
|
|
func (q *SchedQueue) Pop() (event SchedEvent) {
|
|
if q.Length() > 0 {
|
|
elem := q.taskList.Front()
|
|
event = (elem.Value).(SchedEvent)
|
|
q.taskList.Remove(elem)
|
|
return
|
|
}else{
|
|
return nil
|
|
}
|
|
}
|