gpt4 book ai didi

java - 为什么 Spring DeferredResult 在我的应用程序中串行执行?

转载 作者:行者123 更新时间:2023-11-30 10:25:58 25 4
gpt4 key购买 nike

我正在尝试构建一个 REST 网络服务器,其中 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;
}
}

为了测试,我以大约 2 秒的间隔从 ReSTLet 向同一个端点发送了两个 GET 请求。然而,我在我的 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 秒后立即发出的,这是我调用 sleep 的确切时间间隔(即使我在第一个请求后约 2 秒发送了请求)。因此,tomcat 似乎正在对传入请求进行排序。我怎样才能让tomcat不对请求进行排序?还是我遗漏了一些非常明显的东西。

最佳答案

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

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

关于java - 为什么 Spring DeferredResult 在我的应用程序中串行执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45888693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com