Skip to content

Commit 03d90b7

Browse files
authored
chore(queue): don't prepare request data before worker done. (#63)
* chore(queue): don't prepare request data before the worker has done. Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
1 parent ed24fa1 commit 03d90b7

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

queue.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,16 @@ func (q *Queue) start() {
251251
tasks := make(chan core.QueuedMessage, 1)
252252

253253
for {
254+
// check worker number
255+
q.schedule()
256+
257+
select {
258+
// wait worker ready
259+
case <-q.ready:
260+
case <-q.quit:
261+
return
262+
}
263+
254264
// request task from queue in background
255265
q.routineGroup.Run(func() {
256266
for {
@@ -289,11 +299,6 @@ func (q *Queue) start() {
289299
return
290300
}
291301

292-
// check worker number
293-
q.schedule()
294-
// wait worker ready
295-
<-q.ready
296-
297302
// start new task
298303
q.metric.IncBusyWorker()
299304
q.routineGroup.Run(func() {

queue_test.go

+28-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func (m mockMessage) Bytes() []byte {
2424
return []byte(m.message)
2525
}
2626

27-
func TestNewQueue(t *testing.T) {
27+
func TestNewQueueWithZeroWorker(t *testing.T) {
2828
controller := gomock.NewController(t)
2929
defer controller.Finish()
3030

@@ -34,18 +34,44 @@ func TestNewQueue(t *testing.T) {
3434

3535
w := mocks.NewMockWorker(controller)
3636
w.EXPECT().Shutdown().Return(nil)
37-
w.EXPECT().Request().Return(nil, nil)
3837
q, err = NewQueue(
3938
WithWorker(w),
39+
WithWorkerCount(0),
4040
)
4141
assert.NoError(t, err)
4242
assert.NotNil(t, q)
4343

4444
q.Start()
45+
time.Sleep(50 * time.Millisecond)
4546
assert.Equal(t, 0, q.BusyWorkers())
4647
q.Release()
4748
}
4849

50+
func TestNewQueueWithDefaultWorker(t *testing.T) {
51+
controller := gomock.NewController(t)
52+
defer controller.Finish()
53+
54+
q, err := NewQueue()
55+
assert.Error(t, err)
56+
assert.Nil(t, q)
57+
58+
w := mocks.NewMockWorker(controller)
59+
m := mocks.NewMockQueuedMessage(controller)
60+
m.EXPECT().Bytes().Return([]byte("test")).AnyTimes()
61+
w.EXPECT().Shutdown().Return(nil)
62+
w.EXPECT().Request().Return(m, nil).AnyTimes()
63+
w.EXPECT().Run(m).Return(nil).AnyTimes()
64+
q, err = NewQueue(
65+
WithWorker(w),
66+
)
67+
assert.NoError(t, err)
68+
assert.NotNil(t, q)
69+
70+
q.Start()
71+
q.Release()
72+
assert.Equal(t, 0, q.BusyWorkers())
73+
}
74+
4975
func TestShtdonwOnce(t *testing.T) {
5076
w := &messageWorker{
5177
messages: make(chan core.QueuedMessage, 100),

worker_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package queue
33
import (
44
"errors"
55
"testing"
6+
"time"
67

78
"github.com/golang-queue/queue/core"
89
"github.com/golang-queue/queue/mocks"
@@ -30,5 +31,6 @@ func TestMockWorkerAndMessage(t *testing.T) {
3031
assert.NoError(t, err)
3132
assert.NotNil(t, q)
3233
q.Start()
34+
time.Sleep(50 * time.Millisecond)
3335
q.Release()
3436
}

0 commit comments

Comments
 (0)