2017-06-28 3 views
0

Ich habe eine MongoDB-Instanz und zwei JavaScript-Dienste auf einem Linux-Server. Der erste Dienst, moscaService.js, überwacht MQTT-Themen auf dem Server und zeichnet auf, was in einer MongoDB-Sammlung gesendet wird. Der zweite Dienst, integrationService.js, wird jede Sekunde ausgeführt und liest Daten aus derselben MongoDB-Sammlung. Wenn ein neues oder mehrere neue Register vorhanden sind, wird er an Ubidots gesendet.Wie wird eine MongoDB-Clientverbindung bei einem Fehler ordnungsgemäß beendet?

Das Problem ist, dass beide Dienste auf der gleichen IP/Port arbeiten: localhost: 27017; und wenn es eine Gelegenheit gibt, bei der beide gleichzeitig aktiv sind (zB moscaService.js zeichnet etwas auf und dann versucht der integrationService.js eine Verbindung herzustellen), wird ein Verbindungsfehler auftreten und der Dienst wird neu gestartet.

Hier sind die Verbindungsteile beiden Dienste:

var MongoClient = require('mongodb').MongoClient; 
var url = 'mongodb://127.0.0.1:27017/myGateway'; 


//integrationService.js 
var job1 = new CronJob('*/1 * * * * *', function() { 
    MongoClient.connect(url, function(err, db) { 
     if(err != null) { 
      logger.error({message: 'Connection error: ' + err}); 
      process.exit(0); 
     } else { 
      executeService(); 
     } 

     function executeService() { 
     // execution block 
     } 
    }); 
}, null, true, timeZone); 


//moscaService.js 
server.on('published', function(packet, client) { 

    //the packet is read here 

    MongoClient.connect(url, function(err, db) { 
     if(err != null) { 
      logger.error({message: 'Connection error: ' + err}); 
      process.exit(0); 
     } else { 
      executeService(); 
     } 

     function executeService() { 
     // execution block 
     } 
    }); 
}); 

Was ich brauche, ist ein Weg, um richtig die err zu behandeln, anstatt nur den Dienst austreten, denn wenn es neue Nachrichten veröffentlicht werden, während der Dienst Neustart, sie werden verloren gehen. So etwas wie testen, ob der Port vor dem Verbinden geöffnet ist, oder einen anderen Port öffnen.

Ich habe versucht, eine andere Instanz von MongoDB auf einem anderen Port zu erstellen, damit jeder Dienst auf einen hört, aber es sieht so aus, als ob Mongo mehr als eine Instanz sperrt, wenn es versucht, sich mit derselben Datenbank zu verbinden.

Die Codeausschnitte hier sind nur ein kleiner Teil; Wenn jemand mehr Antworten benötigt, sag es einfach und ich füge sie hinzu.

Antwort

0

Ich habe eine Änderung vorgenommen und es hat dieses Problem gelöst. Ich habe den Code so geändert, dass integrationService eine Verbindung zu MongoDB herstellt, bevor ich die CronJob starte; auf diese Weise verbindet es nur einmal und es hält die Verbindung am Leben.

Hier ist das Verbindungsteil des Codes:

var MongoClient = require('mongodb').MongoClient; 
var url = 'mongodb://127.0.0.1:27017/myGateway'; 

//integrationService.js 
MongoClient.connect(url, function(err, db) { 
    var job1 = new CronJob('*/1 * * * * *', function() { 
    if(err != null) { 
     logger.error({message: 'Connection error: ' + err}); 
     process.exit(0); 
    } else { 
     executeService(); 
    } 

    function executeService() { 
     // execution block 
    } 
    }, null, true, timeZone); // end CronJob 
}); // end MongoClient.connect 

Da dies das Problem gelöst hat, habe ich verlassen die err Behandlung kann wie war (obwohl ein eleganter Weg, um es zu behandeln, noch wünschenswert ist).

Die Lösung des Problems auf integrationService hat es auf moscaService ebenso gelöst, aber ich plane, die gleiche Änderung auf dem zweiten Dienst auch vorzunehmen.

Verwandte Themen