Spring-Boot:处理多个请求的并发问题

16

我正在使用Spring Boot来构建RESTful Web服务,我的IDE是Eclipse Oxygen。

我通过Chrome2秒钟发送多个HTTP get请求,但它们被一个接一个地触发。 每个请求都将等待前一个请求完成。

这是我的控制器代码:

@RestController
@RequestMapping("/dummy")
public class DummyController {
    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<Map<String, String>> dummytsp(@RequestParam(value="msg", defaultValue="Hello") String msg) {
        System.out.println("" + new Date() + ": ThreadId " + Thread.currentThread().getId());

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Map<String, String> response = new HashMap<>();
        response.put("message", msg);
        return new ResponseEntity<>(response, HttpStatus.OK);
    }
}

我的控制台输出为:

Thu Sep 14 11:31:15 EDT 2017: ThreadId 25
Thu Sep 14 11:31:20 EDT 2017: ThreadId 26
Thu Sep 14 11:31:25 EDT 2017: ThreadId 28
Thu Sep 14 11:31:30 EDT 2017: ThreadId 30
控制台输出显示控制器每5秒调用一次。但我会每2秒发送请求。 我该如何处理并发的多个请求?(我应该每2秒钟看到控制台输出) 更新: 如果我在不同的浏览器中发送请求,它可以正常工作。 如果我在相同的浏览器/应用程序中测试并共享会话,则问题将出现。
是否可能接受来自相同会话的并发多个请求?
谢谢!

我无法复现这个问题。默认情况下,Spring Boot Web应用程序是多线程的,可以同时处理多个请求。你是否正在使用嵌入式Tomcat?您是否更改了任何默认线程设置(例如server.tomcat.max-threads)? - Kyle Anderson
@KyleAnderson 如果我从不同的浏览器发送请求,代码就可以正常工作。但是当我在同一个浏览器中发送请求(打开标签页)时,问题就出现了。我已经更新了我的帖子,请检查。谢谢! - Top.Deck
1
这可能是浏览器特定的小问题。在Windows 10上,Chrome和Firefox似乎会将多个请求排队到同一个URL,而IE、Edge和curl则不会。 - Kyle Anderson
3
@KyleAnderson 你说得对。我正在使用 Chrome,导致出现问题,但是 curl 命令可以正常工作。您介意将您的评论作为答案发布,以便我可以接受您的答案。 - Top.Deck
1个回答

19

默认情况下,Spring Boot Web 应用程序是多线程的,并且可以同时处理多个请求。

这可能是特定于浏览器的问题。在 Windows 10 上,Chrome 和 Firefox 确实会将多个请求排队到同一个 URL,而 IE、Edge 和 curl 则不会。


嗨,@Kyle Anderson,所以我不需要明确地使用Executor或Thread。 - Ninad Kulkarni
如何处理1000多个同时请求?假设服务只返回“hello world”而不进行任何其他处理?我尝试将默认的最大线程数从200更改为800+,但TPS不会增加,谢谢。 - Diego Ramos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接