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 } }