@@ -33,6 +33,19 @@ type Worker struct {
33
33
logger queue.Logger
34
34
stopFlag int32
35
35
startFlag int32
36
+ busyWorkers uint64
37
+ }
38
+
39
+ func (w * Worker ) incBusyWorker () {
40
+ atomic .AddUint64 (& w .busyWorkers , 1 )
41
+ }
42
+
43
+ func (w * Worker ) decBusyWorker () {
44
+ atomic .AddUint64 (& w .busyWorkers , ^ uint64 (0 ))
45
+ }
46
+
47
+ func (w * Worker ) BusyWorkers () uint64 {
48
+ return atomic .LoadUint64 (& w .busyWorkers )
36
49
}
37
50
38
51
// WithAddr setup the addr of NSQ
@@ -114,32 +127,36 @@ func NewWorker(opts ...Option) *Worker {
114
127
}
115
128
116
129
// BeforeRun run script before start worker
117
- func (s * Worker ) BeforeRun () error {
130
+ func (w * Worker ) BeforeRun () error {
118
131
return nil
119
132
}
120
133
121
134
// AfterRun run script after start worker
122
- func (s * Worker ) AfterRun () error {
123
- s .startOnce .Do (func () {
135
+ func (w * Worker ) AfterRun () error {
136
+ w .startOnce .Do (func () {
124
137
time .Sleep (100 * time .Millisecond )
125
- err := s .q .ConnectToNSQD (s .addr )
138
+ err := w .q .ConnectToNSQD (w .addr )
126
139
if err != nil {
127
140
panic ("Could not connect nsq server: " + err .Error ())
128
141
}
129
142
130
- atomic .CompareAndSwapInt32 (& s .startFlag , 0 , 1 )
143
+ atomic .CompareAndSwapInt32 (& w .startFlag , 0 , 1 )
131
144
})
132
145
133
146
return nil
134
147
}
135
148
136
- func (s * Worker ) handle (job queue.Job ) error {
149
+ func (w * Worker ) handle (job queue.Job ) error {
137
150
// create channel with buffer size 1 to avoid goroutine leak
138
151
done := make (chan error , 1 )
139
152
panicChan := make (chan interface {}, 1 )
140
153
startTime := time .Now ()
141
154
ctx , cancel := context .WithTimeout (context .Background (), job .Timeout )
142
- defer cancel ()
155
+ w .incBusyWorker ()
156
+ defer func () {
157
+ cancel ()
158
+ w .decBusyWorker ()
159
+ }()
143
160
144
161
// run the job
145
162
go func () {
@@ -151,15 +168,15 @@ func (s *Worker) handle(job queue.Job) error {
151
168
}()
152
169
153
170
// run custom process function
154
- done <- s .runFunc (ctx , job )
171
+ done <- w .runFunc (ctx , job )
155
172
}()
156
173
157
174
select {
158
175
case p := <- panicChan :
159
176
panic (p )
160
177
case <- ctx .Done (): // timeout reached
161
178
return ctx .Err ()
162
- case <- s .stop : // shutdown service
179
+ case <- w .stop : // shutdown service
163
180
// cancel job
164
181
cancel ()
165
182
@@ -179,10 +196,10 @@ func (s *Worker) handle(job queue.Job) error {
179
196
}
180
197
181
198
// Run start the worker
182
- func (s * Worker ) Run () error {
199
+ func (w * Worker ) Run () error {
183
200
wg := & sync.WaitGroup {}
184
201
panicChan := make (chan interface {}, 1 )
185
- s .q .AddHandler (nsq .HandlerFunc (func (msg * nsq.Message ) error {
202
+ w .q .AddHandler (nsq .HandlerFunc (func (msg * nsq.Message ) error {
186
203
wg .Add (1 )
187
204
defer func () {
188
205
wg .Done ()
@@ -198,14 +215,14 @@ func (s *Worker) Run() error {
198
215
199
216
var data queue.Job
200
217
_ = json .Unmarshal (msg .Body , & data )
201
- return s .handle (data )
218
+ return w .handle (data )
202
219
}))
203
220
204
221
// wait close signal
205
222
select {
206
- case <- s .stop :
223
+ case <- w .stop :
207
224
case err := <- panicChan :
208
- s .logger .Error (err )
225
+ w .logger .Error (err )
209
226
}
210
227
211
228
// wait job completed
@@ -215,39 +232,39 @@ func (s *Worker) Run() error {
215
232
}
216
233
217
234
// Shutdown worker
218
- func (s * Worker ) Shutdown () error {
219
- if ! atomic .CompareAndSwapInt32 (& s .stopFlag , 0 , 1 ) {
235
+ func (w * Worker ) Shutdown () error {
236
+ if ! atomic .CompareAndSwapInt32 (& w .stopFlag , 0 , 1 ) {
220
237
return queue .ErrQueueShutdown
221
238
}
222
239
223
- s .stopOnce .Do (func () {
224
- if atomic .LoadInt32 (& s .startFlag ) == 1 {
225
- s .q .Stop ()
226
- s .p .Stop ()
240
+ w .stopOnce .Do (func () {
241
+ if atomic .LoadInt32 (& w .startFlag ) == 1 {
242
+ w .q .Stop ()
243
+ w .p .Stop ()
227
244
}
228
245
229
- close (s .stop )
246
+ close (w .stop )
230
247
})
231
248
return nil
232
249
}
233
250
234
251
// Capacity for channel
235
- func (s * Worker ) Capacity () int {
252
+ func (w * Worker ) Capacity () int {
236
253
return 0
237
254
}
238
255
239
256
// Usage for count of channel usage
240
- func (s * Worker ) Usage () int {
257
+ func (w * Worker ) Usage () int {
241
258
return 0
242
259
}
243
260
244
261
// Queue send notification to queue
245
- func (s * Worker ) Queue (job queue.QueuedMessage ) error {
246
- if atomic .LoadInt32 (& s .stopFlag ) == 1 {
262
+ func (w * Worker ) Queue (job queue.QueuedMessage ) error {
263
+ if atomic .LoadInt32 (& w .stopFlag ) == 1 {
247
264
return queue .ErrQueueShutdown
248
265
}
249
266
250
- err := s .p .Publish (s .topic , job .Bytes ())
267
+ err := w .p .Publish (w .topic , job .Bytes ())
251
268
if err != nil {
252
269
return err
253
270
}
0 commit comments