1
我正在尝试构建一个REST Web服务器,其中GET请求是非阻塞的,即使它需要进行一个稍微耗时的调用。为什么在我的应用程序中连续执行Spring DeferredResult?
@RestController
public class Endpoint {
static int callCount = 0;
@RequestMapping (value = "/endpoints", method = RequestMethod.GET)
public DeferredResult<Integer> someGetMethod() {
System.out.println("Mita: GET Called. Count#: " + callCount++);
DeferredResult<Integer> deferredResult = new DeferredResult<>();
new Thread(() -> {
deferredResult.setResult(getSomething());
}).start();
System.out.println("Mita: Thread started");
return deferredResult;
}
private int getSomething() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 100;
}
}
为了测试,我发送了两个GET请求,从Restlet到同一端点,间隔约2秒。但是,我在我的spring应用程序的DEBUG级日志中看到以下内容。
2017-08-26 01:16:38.231 DEBUG 1252 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Received [GET /endpoints/ HTTP/1.1
Host: localhost:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
Accept: */*
DNT: 1
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,es;q=0.6,zh-CN;q=0.4,zh;q=0.2
]
...
...
2017-08-26 01:16:43.399 DEBUG 1252 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer : Received [GET /endpoints/ HTTP/1.1
Host: localhost:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
Accept: */*
DNT: 1
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,es;q=0.6,zh-CN;q=0.4,zh;q=0.2
]
注意,两个请求是怎么来之后5秒,精确的时间间隔我称睡眠(即使我后,第一个发送的请求〜2秒)。所以,看起来tomcat正在顺序化传入的请求。我如何让tomcat不要序列化请求?或者是我错过了一些非常明显的东西。
你说得对。看起来Restlet是这里的罪魁祸首。我使用JMeter测试了我的服务器,我可以看到大约100个并发呼叫在5000到5010毫秒之间返回。感谢您指出了这一点。 – Moni