我正在使用node.js構建應用程序,並且該應用程序與Tomcat服務器進行通信。當tomcat服務器啓動時,我不確定Tomcat是否準備好並且已經啓動,現在我在Windows和Mac上使用CURL和WGET,超時時間爲2秒,以檢查localhost:8080是否已經啓動。確定Tomcat的最佳方法是從node.js開始
有沒有更好的方式來做到這一點,而不依賴於CURL和WGET?
我正在使用node.js構建應用程序,並且該應用程序與Tomcat服務器進行通信。當tomcat服務器啓動時,我不確定Tomcat是否準備好並且已經啓動,現在我在Windows和Mac上使用CURL和WGET,超時時間爲2秒,以檢查localhost:8080是否已經啓動。確定Tomcat的最佳方法是從node.js開始
有沒有更好的方式來做到這一點,而不依賴於CURL和WGET?
好了,你可以從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
});
});
文檔:
建議的方法是創建在Tomcat應用程序心跳服務(即簡單的服務,當它啓動時發送OK),並每隔x秒輪詢一次。
心跳服務對於在應用程序運行時進行監控至關重要,並且即使它已經在端口上偵聽(因爲有一些嚴重的初始化正在進行),應用程序還沒有準備好。
雖然還有其他方法,但如果您位於同一臺服務器上,則可以對catalina.out進行尾部處理,直到收到「服務器啓動」行。
你可以設置你的tomcat應用程序來通知你的服務器它已經啓動了(儘管這意味着tomcat需要知道node.js服務器的url),或者設置某種消息隊列(比如ApacheMq或者類似的)可以在tomcat啓動時註冊,這也將允許在兩個服務之間推送消息。
你可以實現一個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);
}
});
我不斷收到錯誤: 「遇到錯誤:連接ECONNREFUSED」即使我使用sudo。 – user220755 2013-04-26 18:30:30
@ user220755您正在使用端口8080,因此將給定的exmaple中的端口80更改爲8080。併爲測試給路徑爲'/' – user568109 2013-04-29 05:02:53
不幸的是,這並沒有奏效。 – user220755 2013-04-29 05:50:59