Java 为什么Spring DelferredResult在我的应用程序中连续执行?

Java 为什么Spring DelferredResult在我的应用程序中连续执行?,java,spring,spring-mvc,tomcat,concurrency,Java,Spring,Spring Mvc,Tomcat,Concurrency,我正在尝试构建一个RESTWeb服务器,其中GET请求是非阻塞的,即使它需要进行一个稍微耗时的调用 @RestController public class Endpoint { static int callCount = 0; @RequestMapping (value = "/endpoints", method = RequestMethod.GET) public DeferredResult<Integer> someGetMethod() {

我正在尝试构建一个RESTWeb服务器,其中GET请求是非阻塞的,即使它需要进行一个稍微耗时的调用

@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;
    }
}

请注意,这两个请求是如何在5秒之后发出的,这正是我调用sleep的时间间隔(尽管我在第一个请求发出后2秒发出了请求)。因此,tomcat似乎正在对传入的请求进行顺序化。如何使tomcat不将请求顺序化?或者是因为我遗漏了一些非常明显的东西。

使用
DeferredResult
(或者它使用的Servlet异步模式)不会阻止客户端(在本例中是Restlet)在收到第一个请求的响应之前不等待5秒


对于调用Spring端点的客户端来说,看起来就像Spring端点根本没有使用异步模式一样。这意味着Restlet或Tomcat可能会等到第一个请求完成后,再向端点提供第二个请求。

你说得对。看来Restlet是罪魁祸首。我使用JMeter测试了我的服务器,我可以看到大约100个并发调用在5000到5010毫秒内返回。感谢您指出这一点。嗨,我和您有类似的问题。你能告诉我你是如何解决的吗?@DenisStephanov在我的例子中,是测试应用程序在按顺序发送请求。你可能想看看同样的可能性。
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

]