2013-04-26 9 views
5

私はnode.jsを使ってアプリケーションを構築しており、そのアプリケーションはTomcatサーバーと通信しています。 Tomcatサーバーが起動している間、Tomcatが準備完了しているかどうかわからないので、WindowsとMacでCURLとWGETを使用して、localhost:8080が起動しているかどうかを2秒間確認します。Tomcatがnode.jsで始まったと判断する最良の方法は何ですか

CURLとWGETに依存せずにこれを行うより良い方法はありますか?

答えて

1

さて、あなたは、Node.jsのアプリからの要求を行うことができます。

var http = require("http"); 

var options = { 
    host: "example.com", 
    port: 80, 
    path: "/foo.html" 
}; 

http.get(options, function(resp){ 

    var data = ""; 

    resp.on("data", function(chunk){ 
     data += chunk; 
    }); 

    resp.on("end", function() { 
     console.log(data); 
     // do something with data 
    }); 

}).on("error", function(e){ 
    // HANDLE ERRORS 
    console.log("Got error: " + e.message); 

}).on("socket", function(socket) { 
    // ADD TIMEOUT 
    socket.setTimeout(2000); 
    socket.on("timeout", function() { 
     req.abort(); 
     // or make the request one more time 
    }); 
}); 

ドキュメント:

http://nodejs.org/docs/v0.4.11/api/http.html#http.request

+0

私はエラーを取得しておく: "ガット・エラー:ECONNREFUSEDを接続します"私がsudoを使っていても。 – user220755

+0

@ user220755あなたはポート8080を使用しているので、指定された例ではポート80を8080に変更してください。そしてテストのためにパスを '/'として与える – user568109

+0

残念ながら、それはうまくいきませんでした。 – user220755

2

の提案方法は、Tomcatアプリケーション(IE A上のハートビートサービスを作成することですそれが稼働しているときにOKを送信する単純なサービス)、毎x秒ごとにポーリングします。
ハートビートサービスは、アプリケーションの実行中に監視するために不可欠です。また、ポートですでにリッスンしているにもかかわらず、アプリケーションが準備できていない場合もあります。

他の方法がありますが、同じサーバーにいる場合は、「サーバーが開始しました」行を受信するまでcatalina.outを尾行できます。
Tomcatアプリケーションをセットアップして、サーバーに通知します(ただし、Tomcatはnode.jsサーバーのURLを知る必要があります)。あるいは、ApacheMqなどのようなメッセージキューを設定しますtomcatが起動しているときに登録することができます。これにより、2つのサービス間でプッシュメッセージが可能になります。

2

httpWatcher(ファイルウォッチャー - fs.watchの契約を模倣する)を実装することができます。 httpエンドポイント(ステータスルートまたはhtmlファイル)をポーリングし、200が返されたとき(または最大実行に達したとき)にコールバックを起動します。このような何か:

var request = require('request'); 

var watch = function(uri) { 
    var options; 
    var callback; 

    if ('object' == typeof arguments[1]) { 
    options = arguments[1]; 
    callback = arguments[2]; 
    } else { 
    options = {}; 
    callback = arguments[1]; 
    } 

    if (options.interval === undefined) options.interval = 2000; 
    if (options.maxRuns === undefined) options.maxRuns = 10; 
    var runCount = 0; 

    var intervalId = setInterval(function() { 
    runCount++; 
    if(runCount > options.maxRuns) { 
     clearInterval(intervalId); 
     callback(null, false); 
    } 

    request(uri, function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
      clearInterval(intervalId); 
      callback(null, true); 
      } 
     }); 
    }, options.interval); 
} 

そして、そのようにそれを使用します。

watch('http://blah.asdfasdfasdfasdfasdfs.com/', function(err, isGood) { 
    if (!err) { 
     console.log(isGood); 
    } 
}); 

やオプションに渡す...

watch('http://www.google.com/', {interval:1000,maxRuns:3}, 
    function(err, isGood) { 
    if (!err) { 
     console.log(isGood); 
    } 
});