2016-04-13 00:27:24 +00:00
|
|
|
package queue
|
|
|
|
|
|
|
|
//go:generate mockery -name Queue -output mock -case=underscore
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
"golang.org/x/net/context"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ErrNotFound indicates the requested work item does not
|
|
|
|
// exist in the queue.
|
|
|
|
var ErrNotFound = errors.New("queue item not found")
|
|
|
|
|
|
|
|
type Queue interface {
|
|
|
|
// Publish inserts work at the tail of this queue, waiting for
|
|
|
|
// space to become available if the queue is full.
|
|
|
|
Publish(*Work) error
|
|
|
|
|
|
|
|
// Remove removes the specified work item from this queue,
|
|
|
|
// if it is present.
|
|
|
|
Remove(*Work) error
|
|
|
|
|
|
|
|
// PullClose retrieves and removes the head of this queue,
|
|
|
|
// waiting if necessary until work becomes available.
|
|
|
|
Pull() *Work
|
|
|
|
|
|
|
|
// PullClose retrieves and removes the head of this queue,
|
|
|
|
// waiting if necessary until work becomes available. The
|
|
|
|
// CloseNotifier should be provided to clone the channel
|
|
|
|
// if the subscribing client terminates its connection.
|
|
|
|
PullClose(CloseNotifier) *Work
|
|
|
|
}
|
|
|
|
|
|
|
|
// Publish inserts work at the tail of this queue, waiting for
|
|
|
|
// space to become available if the queue is full.
|
|
|
|
func Publish(c context.Context, w *Work) error {
|
|
|
|
return FromContext(c).Publish(w)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove removes the specified work item from this queue,
|
|
|
|
// if it is present.
|
|
|
|
func Remove(c context.Context, w *Work) error {
|
|
|
|
return FromContext(c).Remove(w)
|
|
|
|
}
|
|
|
|
|
2016-05-11 10:53:48 +00:00
|
|
|
// Pull retrieves and removes the head of this queue,
|
2016-04-13 00:27:24 +00:00
|
|
|
// waiting if necessary until work becomes available.
|
|
|
|
func Pull(c context.Context) *Work {
|
|
|
|
return FromContext(c).Pull()
|
|
|
|
}
|
|
|
|
|
|
|
|
// PullClose retrieves and removes the head of this queue,
|
|
|
|
// waiting if necessary until work becomes available. The
|
|
|
|
// CloseNotifier should be provided to clone the channel
|
|
|
|
// if the subscribing client terminates its connection.
|
|
|
|
func PullClose(c context.Context, cn CloseNotifier) *Work {
|
|
|
|
return FromContext(c).PullClose(cn)
|
|
|
|
}
|
|
|
|
|
|
|
|
// CloseNotifier defines a datastructure that is capable of notifying
|
|
|
|
// a subscriber when its connection is closed.
|
|
|
|
type CloseNotifier interface {
|
|
|
|
// CloseNotify returns a channel that receives a single value
|
|
|
|
// when the client connection has gone away.
|
|
|
|
CloseNotify() <-chan bool
|
|
|
|
}
|