Skip to content

Commit 6e79365

Browse files
committed
Rework API
1 parent 0411390 commit 6e79365

29 files changed

+667
-594
lines changed

.golangci.yml

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
run:
2+
tests: false

azsqs/factory.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ type factory struct {
1616

1717
var _ taskq.Factory = (*factory)(nil)
1818

19-
func (f *factory) NewQueue(opt *taskq.QueueOptions) taskq.Queue {
19+
func (f *factory) NewQueue(opt *taskq.QueueOptions) taskq.Queuer {
2020
q := NewQueue(f.sqs, f.accountID, opt)
2121
f.base.Add(q)
2222
return q
2323
}
2424

25-
func (f *factory) Queues() []taskq.Queue {
25+
func (f *factory) Queues() []taskq.Queuer {
2626
return f.base.Queues()
2727
}
2828

azsqs/queue.go

+26-30
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ const msgSizeLimit = 262144
2424
const delayUntilAttr = "TaskqDelayUntil"
2525

2626
type Queue struct {
27-
base base.Queue
28-
opt *taskq.QueueOptions
27+
opt *taskq.QueueOptions
2928

3029
sqs *sqs.SQS
3130
accountID string
@@ -44,7 +43,7 @@ type Queue struct {
4443
consumer *taskq.Consumer
4544
}
4645

47-
var _ taskq.Queue = (*Queue)(nil)
46+
var _ taskq.Queuer = (*Queue)(nil)
4847

4948
func NewQueue(sqs *sqs.SQS, accountID string, opt *taskq.QueueOptions) *Queue {
5049
opt.Init()
@@ -62,15 +61,16 @@ func NewQueue(sqs *sqs.SQS, accountID string, opt *taskq.QueueOptions) *Queue {
6261
}
6362

6463
func (q *Queue) initAddQueue() {
64+
queueName := "azsqs:" + q.opt.Name + ":add"
6565
q.addQueue = memqueue.NewQueue(&taskq.QueueOptions{
66-
Name: "azsqs:" + q.opt.Name + ":add",
66+
Name: queueName,
6767
BufferSize: 100,
6868
Redis: q.opt.Redis,
6969
})
70-
q.addTask = q.addQueue.NewTask(&taskq.TaskOptions{
71-
Name: "add-message",
70+
q.addTask = taskq.NewTask(&taskq.TaskOptions{
71+
Name: queueName + ":add-message",
7272
Handler: taskq.HandlerFunc(q.addBatcherAdd),
73-
FallbackHandler: msgutil.UnwrapMessageHandler(q.HandleMessage),
73+
FallbackHandler: msgutil.UnwrapMessageHandler(taskq.Tasks.HandleMessage),
7474
RetryLimit: 3,
7575
MinBackoff: time.Second,
7676
})
@@ -81,13 +81,14 @@ func (q *Queue) initAddQueue() {
8181
}
8282

8383
func (q *Queue) initDelQueue() {
84+
queueName := "azsqs:" + q.opt.Name + ":delete"
8485
q.delQueue = memqueue.NewQueue(&taskq.QueueOptions{
85-
Name: "azsqs:" + q.opt.Name + ":delete",
86+
Name: queueName,
8687
BufferSize: 100,
8788
Redis: q.opt.Redis,
8889
})
89-
q.delTask = q.delQueue.NewTask(&taskq.TaskOptions{
90-
Name: "delete-message",
90+
q.delTask = taskq.NewTask(&taskq.TaskOptions{
91+
Name: queueName + ":delete-message",
9192
Handler: taskq.HandlerFunc(q.delBatcherAdd),
9293
RetryLimit: 3,
9394
MinBackoff: time.Second,
@@ -110,22 +111,6 @@ func (q *Queue) Options() *taskq.QueueOptions {
110111
return q.opt
111112
}
112113

113-
func (q *Queue) HandleMessage(msg *taskq.Message) error {
114-
return q.base.HandleMessage(msg)
115-
}
116-
117-
func (q *Queue) NewTask(opt *taskq.TaskOptions) *taskq.Task {
118-
return q.base.NewTask(q, opt)
119-
}
120-
121-
func (q *Queue) GetTask(name string) *taskq.Task {
122-
return q.base.GetTask(name)
123-
}
124-
125-
func (q *Queue) RemoveTask(name string) {
126-
q.base.RemoveTask(name)
127-
}
128-
129114
func (q *Queue) Consumer() *taskq.Consumer {
130115
if q.consumer == nil {
131116
q.consumer = taskq.NewConsumer(q)
@@ -152,8 +137,11 @@ func (q *Queue) Add(msg *taskq.Message) error {
152137
if msg.TaskName == "" {
153138
return internal.ErrTaskNameRequired
154139
}
140+
if q.isDuplicate(msg) {
141+
return taskq.ErrDuplicate
142+
}
155143
msg = msgutil.WrapMessage(msg)
156-
return q.addTask.AddMessage(msg)
144+
return q.addQueue.Add(q.addTask.WithMessage(msg))
157145
}
158146

159147
func (q *Queue) queueURL() string {
@@ -286,7 +274,8 @@ func (q *Queue) Release(msg *taskq.Message) error {
286274

287275
// Delete deletes the message from the queue.
288276
func (q *Queue) Delete(msg *taskq.Message) error {
289-
return q.delTask.AddMessage(msgutil.WrapMessage(msg))
277+
msg = msgutil.WrapMessage(msg)
278+
return q.delQueue.Add(q.delTask.WithMessage(msg))
290279
}
291280

292281
// Purge deletes all messages from the queue using SQS API.
@@ -368,8 +357,8 @@ func (q *Queue) addBatch(msgs []*taskq.Message) error {
368357
}
369358

370359
if len(str) > msgSizeLimit {
371-
internal.Logger.Printf("%s: str=%d bytes=%d is larger than %d",
372-
msg.Task, len(str), len(b), msgSizeLimit)
360+
internal.Logger.Printf("task=%q: str=%d bytes=%d is larger than %d",
361+
msg.TaskName, len(str), len(b), msgSizeLimit)
373362
}
374363

375364
entry := &sqs.SendMessageBatchRequestEntry{
@@ -520,6 +509,13 @@ func (q *Queue) GetDeleteQueue() *memqueue.Queue {
520509
return q.delQueue
521510
}
522511

512+
func (q *Queue) isDuplicate(msg *taskq.Message) bool {
513+
if msg.Name == "" {
514+
return false
515+
}
516+
return q.opt.Storage.Exists("taskq:" + q.opt.Name + ":" + msg.Name)
517+
}
518+
523519
func findMessageById(msgs []*taskq.Message, id string) *taskq.Message {
524520
i, err := strconv.Atoi(id)
525521
if err != nil {

bench_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,19 @@ func BenchmarkConsumerRedisq(b *testing.B) {
1919

2020
var (
2121
once sync.Once
22+
q taskq.Queuer
2223
task *taskq.Task
2324
wg sync.WaitGroup
2425
)
2526

2627
func benchmarkConsumer(b *testing.B, factory taskq.Factory) {
2728
once.Do(func() {
28-
q := factory.NewQueue(&taskq.QueueOptions{
29+
q = factory.NewQueue(&taskq.QueueOptions{
2930
Name: "bench",
3031
Redis: redisRing(),
3132
})
3233

33-
task = q.NewTask(&taskq.TaskOptions{
34+
task = taskq.NewTask(&taskq.TaskOptions{
3435
Name: "bench",
3536
Handler: func() {
3637
wg.Done()
@@ -45,7 +46,7 @@ func benchmarkConsumer(b *testing.B, factory taskq.Factory) {
4546
for i := 0; i < b.N; i++ {
4647
for j := 0; j < 100; j++ {
4748
wg.Add(1)
48-
_ = task.Call()
49+
_ = q.Add(task.WithArgs())
4950
}
5051
wg.Wait()
5152
}

0 commit comments

Comments
 (0)