Node.js: ¿Esta fuga de implementación de sondeo larga:

Estoy evaluando Node.js para el posible reemplazo de mi funcionalidad de inserción actual en una aplicación web Java. Escribí un servidor simple de encuestas largas que funciona como un intermediario entre el cliente y el back-end de Java. El cliente realiza una solicitud para suscribirse, y luego el servidor Java puede notificar a los clientes suscritos llamando a Node.js. Parece estar funcionando bien hasta ahora, pero recibí el siguiente mensaje que apunta a una pérdida de memoria:

    (node) warning: possible EventEmitter memory leak detected. 11 listeners added.
Use emitter.setMaxListeners() to increase limit.
Trace
    at EventEmitter.addListener (events.js:168:15)
    at EventEmitter.once (events.js:189:8)
    at route (C:\Users\Juan Pablo\pushserver.js:42:12)
    at Server.onRequest (C:\Users\Juan Pablo\pushserver.js:32:3)
    at Server.EventEmitter.emit (events.js:91:17)
    at HTTPParser.parser.onIncoming (http.js:1793:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23
)
    at Socket.socket.ondata (http.js:1690:22)
    at TCP.onread (net.js:402:27)

Tengo una línea de código que registra los oyentes existentes cada vez que se emite un evento de notificación. Lo he estado ejecutando durante un tiempo y muestra que solo hay un oyente por cliente suscrito (como debería ser), pero esta línea no estaba en el código cuando recibí el mensaje de advertencia. El código era exactamente el mismo, excepto por esa línea dura.

Este es el código del servidor de inserción (es un poco rudimentario ya que todavía estoy aprendiendo Node.js):

var http = require('http');
var url = require("url");
var qs = require("querystring");
var events = require('events');
var util = require('util');

var emitter = new events.EventEmitter;

function onRequest(request, response)
{
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    request.setEncoding("utf8");

    if (request.method == 'POST')
    {
        var postData = "";
        request.addListener("data", function(postDataChunk)
        {
            postData += postDataChunk;
            console.log("Received POST data chunk '"+ postDataChunk + "'.");
        });

        request.addListener("end", function()
        {
            route(pathname, response, postData);
        });
    }
    else if (request.method=='GET')
    {
        var urlParts = url.parse(request.url, true);
        route(pathname, response, urlParts.query);
    }
}

function route(pathname, response, data)
{
    switch (pathname)
    {
        case "/subscription":

            emitter.once("event:notify", function(ids)
            {
                response.writeHead(200, {"Content-Type": "text/html", "Access-Control-Allow-Origin": "*"});
                response.write(JSON.stringify(ids));
                response.end();
            });

            break;

        case "/notification":

            //show how many listeners exist
            console.log(util.inspect(emitter.listeners('event:notify'));

            emitter.emit("event:notify", data.ids);

            response.writeHead(200, {"Content-Type": "text/html", "Access-Control-Allow-Origin": "*"});
            response.write(JSON.stringify(true));
            response.end();
            break;

        default:

            console.log("No request handler found for " + pathname);
            response.writeHead(404, {"Content-Type": "text/plain", "Access-Control-Allow-Origin": "*"});
            response.write("404 - Not found");
            response.end();
            break;
    }
}

http.createServer(onRequest).listen(8888);

console.log('Server running at http://127.0.0.1:8888/');

Tenía la impresión de que el uso de emitter.once eliminaría automáticamente el detector de eventos una vez que se usó, por lo que no sé cómo se podrían haber agregado 11 detectores si solo hubiera un cliente conectado. Estoy pensando que quizás si el cliente se desconecta mientras espera una notificación, los recursos de conexión asociados no se eliminan.

Me pregunto si tengo que manejar manualmente las desconexiones y si realmente hay una fuga en alguna parte. Cualquier consejo es bienvenido. Gracias.

Respuesta 1

Estoy trabajando en una función que desglosa la entrada dada en denominaciones usando una llamada recursiva. En cada paso se repite en dos variantes: continuar con la moneda actual: agregarla a la lista ...

La documentación de GAE para JPA 2.0 establece que el objetivo mejorar_guerra para el archivo hormiga debería ser este: <target name = "datanucleusenhance" depende = "compilar" description = "Realiza mejoras en ...

Si tengo la interfaz: public interface Val {public NilVal NIL; } Y una clase singleton que lo implementa: la clase pública NilVal implementa Val {private static NilVal nil = null; ...

Tengo este método que arroja una excepción pública String Pipeit () arroja TransformerException, TransformerConfigurationException, SAXException, IOException intenté llamar a este método desde una GUI ...