@@ -21,6 +21,10 @@ export interface BullQueueConfig {
21
21
retryAttempts ?: number ;
22
22
}
23
23
24
+ interface BullWorker extends Closeable {
25
+ get worker ( ) : Worker ;
26
+ }
27
+
24
28
/**
25
29
* TaskQueue implementation for BullMQ
26
30
*/
@@ -30,6 +34,9 @@ export class BullQueue
30
34
{
31
35
private activePromise ?: Promise < void > ;
32
36
37
+ private activeWorkers : Record < string , BullWorker > = { } ;
38
+ private activeJobs = 0 ;
39
+
33
40
public createWorker (
34
41
name : string ,
35
42
executor : ( data : TaskPayload ) => Promise < TaskPayload > ,
@@ -42,6 +49,7 @@ export class BullQueue
42
49
// This is by far not optimal - since it still picks up 1 task per queue but waits until
43
50
// computing them, so that leads to bad performance over multiple workers.
44
51
// For that we need to restructure tasks to be flowing through a single queue however
52
+ this . activeJobs += 1 ;
45
53
46
54
// TODO Use worker.pause()
47
55
while ( this . activePromise !== undefined ) {
@@ -54,10 +62,27 @@ export class BullQueue
54
62
} ) ;
55
63
this . activePromise = promise ;
56
64
65
+ // Pause all other workers
66
+ const workersToPause = Object . entries ( this . activeWorkers ) . filter (
67
+ ( [ key ] ) => key !== name
68
+ ) ;
69
+ await Promise . all (
70
+ workersToPause . map ( ( [ , workerToPause ] ) =>
71
+ workerToPause . worker . pause ( true )
72
+ )
73
+ ) ;
74
+
57
75
const result = await executor ( job . data ) ;
58
76
this . activePromise = undefined ;
59
77
void resOutside ( ) ;
60
78
79
+ this . activeJobs -= 1 ;
80
+ if ( this . activeJobs === 0 ) {
81
+ Object . entries ( this . activeWorkers ) . forEach ( ( [ , resumingWorker ] ) =>
82
+ resumingWorker . worker . resume ( )
83
+ ) ;
84
+ }
85
+
61
86
return result ;
62
87
} ,
63
88
{
@@ -76,11 +101,16 @@ export class BullQueue
76
101
log . error ( error ) ;
77
102
} ) ;
78
103
79
- return {
104
+ const instantiatedWorker = {
80
105
async close ( ) {
81
106
await worker . close ( ) ;
82
107
} ,
108
+ get worker ( ) {
109
+ return worker ;
110
+ } ,
83
111
} ;
112
+ this . activeWorkers [ name ] = instantiatedWorker ;
113
+ return instantiatedWorker ;
84
114
}
85
115
86
116
public async getQueue ( queueName : string ) : Promise < InstantiatedQueue > {
0 commit comments