1
+
1
2
const amqplib = require ( 'amqplib' ) ,
2
3
createJobMessage = require ( '../../common/jobMessage' ) . createJobMessage ;
3
- let channels = { } ;
4
+
4
5
let conn = null ;
6
+ let connPromise = null ;
7
+ let channels = { } ;
8
+ let channelPromises = { } ;
9
+
10
+ async function getConnection ( ) {
11
+ if ( conn ) return conn ;
12
+ if ( ! connPromise ) {
13
+ console . log ( "[AMQP] Creating new connection..." ) ;
14
+ connPromise = amqplib . connect ( `amqp://${ process . env . RABBIT_HOSTNAME } ` , "heartbeat=60" ) ;
15
+ }
16
+ conn = await connPromise ;
17
+ return conn ;
18
+ }
5
19
6
20
async function initialize ( queue_name ) {
21
+ const connection = await getConnection ( ) ;
22
+
23
+ if ( channels [ queue_name ] ) return ;
7
24
8
- if ( conn === null ) {
9
- conn = await amqplib . connect ( `amqp://${ process . env . RABBIT_HOSTNAME } ` , "heartbeat=60" ) ;
25
+ if ( ! channelPromises [ queue_name ] ) {
26
+ channelPromises [ queue_name ] = ( async ( ) => {
27
+ try {
28
+ console . log ( `[AMQP] Creating channel for queue ${ queue_name } ` ) ;
29
+ const ch = await connection . createChannel ( ) ;
30
+ await ch . assertQueue ( queue_name , { durable : false , expires : 6000000 } ) ;
31
+ channels [ queue_name ] = ch ;
32
+ } catch ( err ) {
33
+ delete channelPromises [ queue_name ] ; // retry logic
34
+ throw err ;
35
+ }
36
+ } ) ( ) ;
10
37
}
11
- let ch = await conn . createChannel ( )
12
- await ch . assertQueue ( queue_name , { durable : false , expires : 6000000 } ) ;
13
- channels [ queue_name ] = ch
14
38
39
+ await channelPromises [ queue_name ] ;
15
40
}
16
41
17
42
function getQueueName ( context ) {
@@ -30,28 +55,26 @@ function getQueueName(context) {
30
55
31
56
async function enqueueJobs ( jobArr , taskIdArr , contextArr , customParams ) {
32
57
let context = contextArr [ 0 ] ;
33
- let queue_name = getQueueName ( context )
34
- if ( conn === null || ! ( queue_name in channels ) ) {
35
- await initialize ( queue_name )
36
- }
37
- let ch = channels [ queue_name ]
58
+ let queue_name = getQueueName ( context ) ;
38
59
try {
60
+ await initialize ( queue_name ) ;
61
+ let ch = channels [ queue_name ] ;
39
62
40
- console . log ( `jobArr: ${ JSON . stringify ( jobArr ) } , taskIdArr: ${ JSON . stringify ( taskIdArr ) } , contextArr: ${ JSON . stringify ( contextArr ) } , customParams: ${ JSON . stringify ( customParams ) } ` )
63
+ console . log ( `jobArr: ${ JSON . stringify ( jobArr ) } , taskIdArr: ${ JSON . stringify ( taskIdArr ) } , contextArr: ${ JSON . stringify ( contextArr ) } , customParams: ${ JSON . stringify ( customParams ) } ` ) ;
41
64
let tasks = [ ] ;
42
65
43
66
for ( let i = 0 ; i < jobArr . length ; i ++ ) {
44
67
let job = jobArr [ i ] ;
45
68
let taskId = taskIdArr [ i ] ;
46
69
let jobMessage = createJobMessage ( job . ins , job . outs , contextArr [ i ] , taskId ) ;
47
- await context . sendMsgToJob ( JSON . stringify ( jobMessage ) , taskId ) // TODO remove
48
- tasks . push ( { "id" : taskId , "message" : jobMessage } ) ;
70
+ await context . sendMsgToJob ( JSON . stringify ( jobMessage ) , taskId ) ; // TODO remove
71
+ tasks . push ( { "id" : taskId , "message" : jobMessage } ) ;
49
72
}
50
73
51
- await ch . publish ( '' , queue_name , Buffer . from ( JSON . stringify ( { 'tasks' : tasks } ) ) ) ;
74
+ ch . sendToQueue ( queue_name , Buffer . from ( JSON . stringify ( { 'tasks' : tasks } ) ) ) ;
52
75
} catch ( error ) {
53
- console . log ( error )
76
+ console . log ( error ) ;
54
77
}
55
78
}
56
79
57
- exports . enqueueJobs = enqueueJobs
80
+ exports . enqueueJobs = enqueueJobs
0 commit comments