mirror of
https://github.com/hibiken/asynq.git
synced 2024-12-25 23:32:17 +08:00
Maintain a set of queue names in redis set
This commit is contained in:
parent
390eb13149
commit
67f381269a
@ -19,6 +19,7 @@ const (
|
|||||||
processedPrefix = "asynq:processed:" // STRING - asynq:processed:<yyyy-mm-dd>
|
processedPrefix = "asynq:processed:" // STRING - asynq:processed:<yyyy-mm-dd>
|
||||||
failurePrefix = "asynq:failure:" // STRING - asynq:failure:<yyyy-mm-dd>
|
failurePrefix = "asynq:failure:" // STRING - asynq:failure:<yyyy-mm-dd>
|
||||||
QueuePrefix = "asynq:queues:" // LIST - asynq:queues:<qname>
|
QueuePrefix = "asynq:queues:" // LIST - asynq:queues:<qname>
|
||||||
|
AllQueues = "asynq:queues" // SET
|
||||||
DefaultQueue = QueuePrefix + DefaultQueueName // LIST
|
DefaultQueue = QueuePrefix + DefaultQueueName // LIST
|
||||||
ScheduledQueue = "asynq:scheduled" // ZSET
|
ScheduledQueue = "asynq:scheduled" // ZSET
|
||||||
RetryQueue = "asynq:retry" // ZSET
|
RetryQueue = "asynq:retry" // ZSET
|
||||||
|
@ -48,7 +48,12 @@ func (r *RDB) Enqueue(msg *base.TaskMessage) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
key := base.QueueKey(msg.Queue)
|
key := base.QueueKey(msg.Queue)
|
||||||
return r.client.LPush(key, string(bytes)).Err()
|
script := redis.NewScript(`
|
||||||
|
redis.call("LPUSH", KEYS[1], ARGV[1])
|
||||||
|
redis.call("SADD", KEYS[2], KEYS[1])
|
||||||
|
return 1
|
||||||
|
`)
|
||||||
|
return script.Run(r.client, []string{key, base.AllQueues}, string(bytes)).Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dequeue queries given queues in order and pops a task message if there
|
// Dequeue queries given queues in order and pops a task message if there
|
||||||
|
@ -29,12 +29,18 @@ func setup(t *testing.T) *RDB {
|
|||||||
|
|
||||||
func TestEnqueue(t *testing.T) {
|
func TestEnqueue(t *testing.T) {
|
||||||
r := setup(t)
|
r := setup(t)
|
||||||
|
t1 := h.NewTaskMessage("send_email", map[string]interface{}{"to": "exampleuser@gmail.com", "from": "noreply@example.com"})
|
||||||
|
t2 := h.NewTaskMessage("generate_csv", map[string]interface{}{})
|
||||||
|
t2.Queue = "csv"
|
||||||
|
t3 := h.NewTaskMessage("sync", nil)
|
||||||
|
t3.Queue = "low"
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
msg *base.TaskMessage
|
msg *base.TaskMessage
|
||||||
}{
|
}{
|
||||||
{h.NewTaskMessage("send_email", map[string]interface{}{"to": "exampleuser@gmail.com", "from": "noreply@example.com"})},
|
{t1},
|
||||||
{h.NewTaskMessage("generate_csv", map[string]interface{}{})},
|
{t2},
|
||||||
{h.NewTaskMessage("sync", nil)},
|
{t3},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
@ -42,17 +48,21 @@ func TestEnqueue(t *testing.T) {
|
|||||||
|
|
||||||
err := r.Enqueue(tc.msg)
|
err := r.Enqueue(tc.msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("(*RDB).Enqueue = %v, want nil", err)
|
t.Errorf("(*RDB).Enqueue(msg) = %v, want nil", err)
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
gotEnqueued := h.GetEnqueuedMessages(t, r.client)
|
|
||||||
|
qkey := base.QueueKey(tc.msg.Queue)
|
||||||
|
gotEnqueued := h.GetEnqueuedMessages(t, r.client, tc.msg.Queue)
|
||||||
if len(gotEnqueued) != 1 {
|
if len(gotEnqueued) != 1 {
|
||||||
t.Errorf("%q has length %d, want 1", base.DefaultQueue, len(gotEnqueued))
|
t.Errorf("%q has length %d, want 1", qkey, len(gotEnqueued))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if diff := cmp.Diff(tc.msg, gotEnqueued[0]); diff != "" {
|
if diff := cmp.Diff(tc.msg, gotEnqueued[0]); diff != "" {
|
||||||
t.Errorf("persisted data differed from the original input (-want, +got)\n%s", diff)
|
t.Errorf("persisted data differed from the original input (-want, +got)\n%s", diff)
|
||||||
}
|
}
|
||||||
|
if !r.client.SIsMember(base.AllQueues, qkey).Val() {
|
||||||
|
t.Errorf("%q is not a member of SET %q", qkey, base.AllQueues)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user