2017-12-15 13 views
0

nodejs amqplib 모듈을 사용하여 rabbitmq를 연결합니다. 소비 함수가 클로저 함수가된다는 것을 알았지 만 이유를 이해할 수 없습니다. 나는 폐쇄를 사용하지 않았다.amqplib 소비 기능이있는 nodej가 닫히는 이유는 무엇입니까?

내 코드는 다음과 같습니다. returnOK에서 corr이 여전히 처음 값을 얻은 것을 발견했습니다. 이 기능을 두 번째 발사 할 때. corr은 처음에는 여전히 값입니다. 이상하게 생각합니다. 누군가 설명 할 수 있니?

const corr = new Date().getTime(); 
    try { 
    const params = JSON.stringify(req.body); 
    console.log('corr first =', corr); 
    await ch.sendToQueue(q, Buffer.from(params), { 
     deliveryMode: true, 
     correlationId: corr.toString(), 
     replyTo: queue.queue, 
    }); 

    const returnOK = (msg) => { 
     if (msg.properties.correlationId === corr.toString()) { 
     console.info('******* Proxy send message done *******'); 
     res.status(HTTPStatus.OK).json('Done'); 
     } 
    }; 
    await ch.consume(queue.queue, returnOK, { noAck: true }); 
    } catch (error) { 
    res.status(HTTPStatus.INTERNAL_SERVER_ERROR).json(error); 
    } 

답변

0

당신이 새로운 소비자에게 모든 시간을 만들어 사실상 모든 요청에 ​​ch.consume를 호출하고 나타납니다. 한번만 그렇게해야합니다.

첫 번째 소비자가 메시지를받는 중입니다.

이 문제를 해결하려면 ch.consume을 요청 처리기 외부로 옮기고 싶을 것입니다.

+0

좋아, 해보겠습니다. returnOK 함수가 왜 닫혀 있는지 궁금합니다. – Rukeith

+0

@ 루키스 그렇지 않습니다. 각 요청마다 returnOK 인스턴스를 하나씩 생성합니다. 그리고 각각은'ch.consume' 호출로부터 하나의 리스너에 연결됩니다. 마찬가지로 두 번째 요청을하면 첫 번째 요청의 수신기가 패킷을 가져 와서 returnOK의 첫 번째 인스턴스를 호출합니다. –

+0

@ 루키스. 리스너, 즉'ch.consume'에 대해 더 많이 읽어야한다고 생각합니다. 대기열에서 메시지를 받고 싶을 때마다 전화하는 것이 아닙니다. –