2013-04-26 58 views
5

我正在使用node.js構建應用程序,並且該應用程序與Tomcat服務器進行通信。當tomcat服務器啓動時,我不確定Tomcat是否準備好並且已經啓動,現在我在Windows和Mac上使用CURL和WGET,超時時間爲2秒,以檢查localhost:8080是否已經啓動。確定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 2013-04-26 18:30:30

+0

@ user220755您正在使用端口8080,因此將給定的exmaple中的端口80更改爲8080。併爲測試給路徑爲'/' – user568109 2013-04-29 05:02:53

+0

不幸的是,這並沒有奏效。 – user220755 2013-04-29 05:50:59

2

建議的方法是創建在Tomcat應用程序心跳服務(即簡單的服務,當它啓動時發送OK),並每隔x秒輪詢一次。
心跳服務對於在應用程序運行時進行監控至關重要,並且即使它已經在端口上偵聽(因爲有一些嚴重的初始化正在進行),應用程序還沒有準備好。

雖然還有其他方法,但如果您位於同一臺服務器上,則可以對catalina.out進行尾部處理,直到收到「服務器啓動」行。
你可以設置你的tomcat應用程序來通知你的服務器它已經啓動了(儘管這意味着tomcat需要知道node.js服務器的url),或者設置某種消息隊列(比如ApacheMq或者類似的)可以在tomcat啓動時註冊,這也將允許在兩個服務之間推送消息。

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); 
    } 
}); 
相關問題