我正在使用 node.js 构建一个应用程序,并且该应用程序与 Tomcat 服务器通信。当 tomcat 服务器启动时,我不确定 Tomcat 是否已准备好并且是否已启动,现在我在 Windows 和 Mac 上使用 CURL 和 WGET 并以 2 秒的超时时间继续检查 localhost:8080 是否已启动。
有没有更好的方法可以在不依赖 CURL 和 WGET 的情况下做到这一点?
我正在使用 node.js 构建一个应用程序,并且该应用程序与 Tomcat 服务器通信。当 tomcat 服务器启动时,我不确定 Tomcat 是否已准备好并且是否已启动,现在我在 Windows 和 Mac 上使用 CURL 和 WGET 并以 2 秒的超时时间继续检查 localhost:8080 是否已启动。
有没有更好的方法可以在不依赖 CURL 和 WGET 的情况下做到这一点?
您可以实现一个 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);
}
});
建议的方法是在 tomcat 应用程序上创建一个心跳服务(即一个在启动时发送 OK 的简单服务),并每隔 x 秒轮询一次。
心跳服务对于在应用程序运行时进行监控是必不可少的,有时即使应用程序已经在监听端口(因为正在进行一些繁重的初始化),应用程序也没有准备好。
但是还有其他方法,如果您在同一台服务器上,您可以跟踪 catalina.out 直到收到“服务器启动”行。
您可以设置您的 tomcat 应用程序以通知您的服务器它已启动(尽管这意味着 tomcat 需要知道 node.js 服务器的 url),或者设置您可以注册的某种消息队列(如 ApacheMq 等)当 tomcat 启动时,这也将允许在两个服务之间推送消息。
好吧,您可以从 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
});
});
文档: