@@ -14,99 +14,37 @@ import (
14
14
15
15
var _ queue.Worker = (* Worker )(nil )
16
16
17
- // Option for queue system
18
- type Option func (* Worker )
19
-
20
17
// Worker for NSQ
21
18
type Worker struct {
22
- addr string
23
- subj string
24
- queue string
25
19
client * nats.Conn
26
20
stop chan struct {}
27
- stopOnce sync.Once
28
- runFunc func (context.Context , queue.QueuedMessage ) error
29
- logger queue.Logger
30
21
stopFlag int32
31
- metric queue.Metric
22
+ stopOnce sync.Once
23
+ opts options
32
24
}
33
25
34
26
func (w * Worker ) incBusyWorker () {
35
- w .metric .IncBusyWorker ()
27
+ w .opts . metric .IncBusyWorker ()
36
28
}
37
29
38
30
func (w * Worker ) decBusyWorker () {
39
- w .metric .DecBusyWorker ()
31
+ w .opts . metric .DecBusyWorker ()
40
32
}
41
33
42
34
// BusyWorkers return count of busy workers currently.
43
35
func (w * Worker ) BusyWorkers () uint64 {
44
- return w .metric .BusyWorkers ()
45
- }
46
-
47
- // WithAddr setup the addr of NATS
48
- func WithAddr (addr string ) Option {
49
- return func (w * Worker ) {
50
- w .addr = "nats://" + addr
51
- }
52
- }
53
-
54
- // WithSubj setup the subject of NATS
55
- func WithSubj (subj string ) Option {
56
- return func (w * Worker ) {
57
- w .subj = subj
58
- }
59
- }
60
-
61
- // WithQueue setup the queue of NATS
62
- func WithQueue (queue string ) Option {
63
- return func (w * Worker ) {
64
- w .queue = queue
65
- }
66
- }
67
-
68
- // WithRunFunc setup the run func of queue
69
- func WithRunFunc (fn func (context.Context , queue.QueuedMessage ) error ) Option {
70
- return func (w * Worker ) {
71
- w .runFunc = fn
72
- }
73
- }
74
-
75
- // WithLogger set custom logger
76
- func WithLogger (l queue.Logger ) Option {
77
- return func (w * Worker ) {
78
- w .logger = l
79
- }
80
- }
81
-
82
- // WithMetric set custom Metric
83
- func WithMetric (m queue.Metric ) Option {
84
- return func (w * Worker ) {
85
- w .metric = m
86
- }
36
+ return w .opts .metric .BusyWorkers ()
87
37
}
88
38
89
39
// NewWorker for struc
90
40
func NewWorker (opts ... Option ) * Worker {
91
41
var err error
92
42
w := & Worker {
93
- addr : "127.0.0.1:4222" ,
94
- subj : "foobar" ,
95
- queue : "foobar" ,
96
- stop : make (chan struct {}),
97
- runFunc : func (context.Context , queue.QueuedMessage ) error {
98
- return nil
99
- },
100
- metric : queue .NewMetric (),
101
- }
102
-
103
- // Loop through each option
104
- for _ , opt := range opts {
105
- // Call the option giving the instantiated
106
- opt (w )
43
+ opts : newOptions (opts ... ),
44
+ stop : make (chan struct {}),
107
45
}
108
46
109
- w .client , err = nats .Connect (w .addr )
47
+ w .client , err = nats .Connect (w .opts . addr )
110
48
if err != nil {
111
49
panic (err )
112
50
}
@@ -146,7 +84,7 @@ func (w *Worker) handle(job queue.Job) error {
146
84
}()
147
85
148
86
// run custom process function
149
- done <- w .runFunc (ctx , job )
87
+ done <- w .opts . runFunc (ctx , job )
150
88
}()
151
89
152
90
select {
@@ -177,7 +115,7 @@ func (w *Worker) handle(job queue.Job) error {
177
115
func (w * Worker ) Run () error {
178
116
wg := & sync.WaitGroup {}
179
117
panicChan := make (chan interface {}, 1 )
180
- _ , err := w .client .QueueSubscribe (w .subj , w .queue , func (m * nats.Msg ) {
118
+ _ , err := w .client .QueueSubscribe (w .opts . subj , w . opts .queue , func (m * nats.Msg ) {
181
119
wg .Add (1 )
182
120
defer func () {
183
121
wg .Done ()
@@ -190,7 +128,7 @@ func (w *Worker) Run() error {
190
128
_ = json .Unmarshal (m .Data , & data )
191
129
192
130
if err := w .handle (data ); err != nil {
193
- w .logger .Error (err )
131
+ w .opts . logger .Error (err )
194
132
}
195
133
})
196
134
if err != nil {
@@ -201,7 +139,7 @@ func (w *Worker) Run() error {
201
139
select {
202
140
case <- w .stop :
203
141
case err := <- panicChan :
204
- w .logger .Error (err )
142
+ w .opts . logger .Error (err )
205
143
}
206
144
207
145
// wait job completed
@@ -239,7 +177,7 @@ func (w *Worker) Queue(job queue.QueuedMessage) error {
239
177
return queue .ErrQueueShutdown
240
178
}
241
179
242
- err := w .client .Publish (w .subj , job .Bytes ())
180
+ err := w .client .Publish (w .opts . subj , job .Bytes ())
243
181
if err != nil {
244
182
return err
245
183
}
0 commit comments