2023-04-20 02:03:21 +00:00
|
|
|
|
package controller
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"container/list"
|
2024-11-25 08:48:06 +00:00
|
|
|
|
"gitea.pena/PenaSide/feedback/internal/models"
|
2023-04-20 02:03:21 +00:00
|
|
|
|
"sync"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const QueueSize = 100 // Размер очереди
|
|
|
|
|
|
|
|
|
|
// FeedbackQueue - FIFO очередь с размером QueueSize
|
|
|
|
|
type FeedbackQueue struct {
|
|
|
|
|
tasks *list.List
|
|
|
|
|
m sync.Mutex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewFeedbackQueue - создать новую очередь
|
|
|
|
|
func NewFeedbackQueue() *FeedbackQueue {
|
|
|
|
|
return &FeedbackQueue{tasks: list.New(), m: sync.Mutex{}}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Enqueue - добавить элемент в очередь. Возвращает true если очередь не переполнена и false в ином случае
|
|
|
|
|
func (q *FeedbackQueue) Enqueue(record *models.Feedback) bool {
|
|
|
|
|
q.m.Lock()
|
|
|
|
|
|
|
|
|
|
if q.tasks.Len() >= QueueSize {
|
|
|
|
|
q.m.Unlock()
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
q.tasks.PushBack(record)
|
|
|
|
|
q.m.Unlock()
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Dequeue - взять элемент из очереди
|
|
|
|
|
func (q *FeedbackQueue) Dequeue() *models.Feedback {
|
|
|
|
|
q.m.Lock()
|
|
|
|
|
|
|
|
|
|
value := q.tasks.Front()
|
|
|
|
|
if value == nil {
|
|
|
|
|
q.m.Unlock()
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
q.tasks.Remove(value)
|
|
|
|
|
q.m.Unlock()
|
|
|
|
|
|
|
|
|
|
return value.Value.(*models.Feedback)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Len - получить длину очереди
|
|
|
|
|
func (q *FeedbackQueue) Len() int {
|
|
|
|
|
q.m.Lock()
|
|
|
|
|
l := q.tasks.Len()
|
|
|
|
|
q.m.Unlock()
|
|
|
|
|
return l
|
|
|
|
|
}
|