본문 바로가기
프로그래밍/NodeJS

[NodeJS/MQTT] MaxListenersExceededWarning 해결 방안

by 채연2 2019. 11. 1.

 

 

 

 

MaxListenersExceededWarning: Possible EventEmitter memory leak detected.
11 close listeners added.
Use emitter.setMaxListeners() to increase limit.

 

서버와 MQTT 통신을 하던 도중 메시지를 주고받다 보면 위와 같은 경고가 뜨고 프로세스가 죽게 된다.

 

처음에 그래서 client.setMaxListeners(100)으로 제한을 줬지만 100번 돌고 다시 저 경고가 뜬 후 죽었다.

client.setMaxListeners(0)으로 주면 제한이 없다고 했었지만 그래도 죽었다.

 

한참을 헤맨 후 알게 된 사실이 프로그램을 실행하면 루프를 돌 때마다 계속 connect를 해준다는 사실이다.

내가 바보였던게 한 번 connect 되면 계속 유지되는 줄 ㅎㅎ....

 

 

 

 

내가 작성한 코드 구조를 간단하게 보면

 

client = mqtt.connect('mqtt://' + devinfo['server'] + ':1883', {options});

client.on('connect', function () {
    console.log("[CONNECTED]");
    
    client.subscribe('1', {qos:2});
    client.subscribe('2', {qos:2});
    client.subscribe('3', {qos:2});
});

client.on('error', function (topic, error) {
    console.error(topic + ':' + error);
});

client.on('message', function(topic, message, packet){
    console.log('[ON MESSAGE]');
    
    try {
        if(client != null) {
            client.publish(topic, data, options, function(err) {
                if(!err) {}
                else {}
            });
        }
    } catch(err) {
        console.error(err);
    }
}

 

이런 구조로 되어있다.

 

처음엔, 계속 client가 서버에 연결되니까, client.on('connect') 대신 client.once('connect')를 해줬는데, 서버에서 확인해보니 처음 루프 돌 때는 연결이 되었지만 두 번째 루프 돌 때부터는 서버에 연결이 되지 않았다.!

 

계속 시도즁,,

 

 

320x100

 

 

해결방안을 찾았다!!

 heap memory leak 문제니까 서버랑 주고받은 메시지가 쌓여서 그런가 싶어서 client.removeOutgoingMessage(client.getLastMessageId()); 코드를 추가했는데, 자꾸 cb is not a function이라는 에러만 뜨고 해결책은 못 찾고 헤매고 있었다 ㅜㅜ

 

 

그래서 이것저것 시도를 해보다가

 

console.log("[MESSAGE LISTENER] : " + client.listenerCount('message'));
console.log("[CONNECT LISTENER] : " + client.listenerCount('connect'));
console.log("[CONNECT LISTENER] : " + client.listenerCount('error'));

 

다음과 같이 로그를 찍어보았더니 client.listenerCount('connect') : 2 가 찍혔다!!

그래서 connect 할 때 그냥 써줬던 콜백 함수 대신에 정의된 함수를 넣어주고 listener를 제거해줬다. 아래처럼!

 

function mqtt_connect() {
    console.log("[CONNECTED]");
    ...
    ...
}

client.on('connect', mqtt_connect);

...
...

if(client.listenerCount('connect') > 1) {
	client.removeListener('connect', mqtt_connect);
}

 

20분째 계속 돌리고 있는데, 아직은 에러 없이 잘 돌아가는 중 ^,^

 

320x100

'프로그래밍 > NodeJS' 카테고리의 다른 글

[NODEJS] pm2 설치 및 사용  (0) 2020.10.29
[NodeJS/MQTT] MQTT SERVER로 파일 전송하기  (1) 2019.11.04

댓글