mirror of https://github.com/jlelse/GoBlog
Rework queue algorithm
This commit is contained in:
parent
f0d3f1c84f
commit
0a8086e682
40
queue.go
40
queue.go
|
@ -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()
|
||||
}()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue