2017-06-28 11 views
0

私はMongoDBインスタンスと2つのJavaScriptサービスをLinuxサーバー上で実行しています。最初のサービスmoscaService.jsは、サーバー上のMQTTトピックをリッスンし、MongoDBコレクションに送信される内容を記録します。 2番目のサービス、integrationService.jsは毎秒実行され、同じMongoDBコレクション上のデータを読み込み、新しいレジスタ(またはそれ以上)があればそれをUbidotsに送信します。エラー時にMongoDBクライアント接続を正しく終了する方法は?

問題は、両方のサービスが同じIP /ポートで動作することです。localhost:27017;両方が同時にアクティブになっている場合(たとえば、moscaService.jsが何かを記録していて、次にintegrationService.jsが接続しようとする)、接続エラーが発生し、サービスが再開します。ここで

は、両方のサービスの接続部です:存在する場合、サービスがある一方で、新しいメッセージが公開されているので、私は必要なもの

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 
     } 
    }); 
}); 

は、適切にだけではなく、サービスを終了するerrを処理する方法であります再起動すると、それらは失われます。接続する前にポートが開いているかどうかをテストしたり、別のポートを開いたりするようなものです。

私は別のポートでMongoDBの別のインスタンスを作成しようとしましたが、それぞれのサービスをリスンするようにしましたが、Mongoは同じデータベースに接続しようとすると複数のインスタンスをロックしているようです。

ここのコードスニペットはほんの一部です。誰かが答えるためにもっと多くの部品を必要とするならば、そう言いましょう。私はそれらを追加します。

答えて

0

私は変更を加えて、この問題を解決しました。 CronJobを起動する前にintegrationServiceがMongoDBに接続するようにコードを変更しました。そのように、それは一度だけ接続し、接続を生き続ける。ここで

は、コードの接続部です:

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 

これで問題が解決したので、(それを治療するために、よりエレガントな方法は依然として望ましいが)があったとして、私はerr治療を残してきました。

integrationServiceで問題を解決しましたが、moscaServiceでも解決しましたが、2番目のサービスでも同じ変更を行う予定です。

関連する問題