我试图理解“在节点js中,除了代码之外,所有内容都是并行运行”语句。所以我决定尝试一下。我有一个宁静的服务,我在我的tomcat本地服务器上运行。
@RequestMapping(value = "/ping", method = RequestMethod.GET)
public String ping() throws InterruptedException {
//Simulation for background processing
Thread.sleep(10000);
return "Hi I am Tomcat Ping Service";
}
同样地,我还在我的本地运行NodeJs restful api。
app.get('/nodeTest', function(req, res){
var options = {
host: '192.168.1.8',
port : 8080,
path : '/TestNode/rest/ping'
};
http.get(options, function(resp) {
console.log("Got response: " + resp.statusCode);
res.send("Inside Node JS Ping Service.");
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
});
我从我的浏览器调用节点restservice,后者又在tomcat上调用restservice。 为了检查nodejs并发性,我在两秒延迟后在两个选项卡中点击http://localhost:3000/nodeTest。 我在10.03秒之后得到的第一个呼叫响应,而第二个响应用了18.01秒。
这个结果我没想到节点会分配一个回调函数,每当请求完成时它就会执行回调函数(同时它可以处理其他请求。)所以当第一个请求在将回调分配给该请求之后出现时,它应该采取第二个请求,而不是等待第一个请求完成。 因此,理想情况下,第二次通话应该花费近10秒才能完成。
这就提出了一个问题,即节点js如何比每个线程模型的传统请求更快。
编辑: -
我正在使用node eclipse插件运行nodeJS和简单的SpringMVC rest服务来运行Tomcat上的rest服务。
确定了Chrome问题的根本原因,chrome阻止了请求,因此第二次呼叫被延迟。
请求时间
但是当我尝试来自firefox的一个请求和一个来自chrome的请求时,它起作用了。
以下是日志: - 节点服务器: -
Request Entry time in Node JS :: Sun Jul 19 2015 21:57:39 GMT-0400 (Eastern Daylight Time)
Request Entry time in Node JS :: Sun Jul 19 2015 21:57:45 GMT-0400 (Eastern Daylight Time)
Got response: 200
Time Taken in seconds :: 10.004
[90mGET /nodeTest [32m200 [90m10004ms - 28b[0m
Got response: 200
Time Taken in seconds :: 10.005
Tomcat服务器: -
Thread Entry time in Tomcat :: http-8080-1 :: Sun Jul 19 21:57:39 EDT 2015
Thread Entry time in Tomcat :: http-8080-2 :: Sun Jul 19 21:57:45 EDT 2015
Time taken by thread :: http-8080-1 :: 10
Time taken by thread :: http-8080-2 :: 10
不确定为什么Chrome会停止呼叫。