Rework queue algorithm

This commit is contained in:
Jan-Lukas Else 2022-07-17 11:26:27 +02:00
parent f0d3f1c84f
commit 0a8086e682
1 changed files with 27 additions and 19 deletions

View File

@ -78,32 +78,39 @@ func (a *goBlog) peekQueue(ctx context.Context, name string) (*queueItem, error)
type queueProcessFunc func(qi *queueItem, dequeue func(), reschedule func(time.Duration))
func (a *goBlog) listenOnQueue(queueName string, wait time.Duration, process queueProcessFunc) {
go func() {
done := false
if process == nil {
return
}
endQueue := false
queueContext, cancelQueueContext := context.WithCancel(context.Background())
var wg sync.WaitGroup
wg.Add(1)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
a.shutdown.Add(func() {
done = true
cancel()
endQueue = true
cancelQueueContext()
wg.Wait()
log.Println("Stopped queue:", queueName)
})
for !done {
qi, err := a.peekQueue(ctx, queueName)
wg.Add(1)
go func() {
queueLoop:
for {
if endQueue {
break queueLoop
}
qi, err := a.peekQueue(queueContext, queueName)
if err != nil {
// log.Println("queue peek error:", err.Error())
continue
log.Println("queue peek error:", err.Error())
continue queueLoop
}
if qi == nil {
// No item in the queue, wait a moment
select {
case <-time.After(wait):
continue
case <-ctx.Done():
done = true
continue
continue queueLoop
case <-queueContext.Done():
break queueLoop
}
}
process(
@ -120,6 +127,7 @@ func (a *goBlog) listenOnQueue(queueName string, wait time.Duration, process que
},
)
}
log.Println("stopped queue:", queueName)
wg.Done()
}()
}