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