gpt4 book ai didi

java - 如何使用SpringBoot的@RestController并行处理多个请求?

转载 作者:行者123 更新时间:2023-12-02 09:39:23 38 4
gpt4 key购买 nike

我对 Spring Boot 比较陌生,并从他们的 getting started site 中的非常简单的示例开始。 ,即(在 Controller 端):

@RestController
public class HelloController {

@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!";
}

}

我现在想要的是,可以并行处理同一个 Controller 的多个(可能长时间运行)请求。

由于我已经了解到 @RestController 将被实例化为单例,因此我很清楚,将处理多个请求(由相同的方法处理)依次更新:我的错:我认为这与 Controller 是单例这一事实有关。但事实是这样的:为什么它不能并行运行呢?

因此,我对上面的示例进行了如下更改,以便根据每个请求创建一个新的 Controller 实例,并通过某种方法检查实际发生的情况:

@RestController
@Scope(value = "request")
public class HelloController {

private static AtomicInteger count = new AtomicInteger(0);

public HelloController() {
count.incrementAndGet();
}

@PostConstruct
public void init() {
System.out.println("start request " + count);
}

@PreDestroy
public void onDestroy() {
System.out.println("end request " + count);
}

@RequestMapping("/")
public String index() throws InterruptedException {
LocalDateTime now = LocalDateTime.now();
TimeUnit.SECONDS.sleep(15);
System.out.println(now);
return "Greetings from Spring Boot! " + now + " " + count.get();
}

}

现在我希望看到请求在大约 15 秒内并行处理,但实际上我只能看到它显然是按顺序处理的,并且需要 30 秒(在标准输出上):

start request 1
2017-02-11T14:19:47.429
end request 1
start request 2
2017-02-11T14:20:02.467
end request 2

所以我的问题是:我怎样才能实现并行处理此类请求,因为为每个请求创建一个实例显然是不够的?

<小时/>

小评论:我已经尝试将 @Asnync 注释与 @EnableAsync 结合用于应用程序类,但这似乎是“即发即忘”,例如我无法得到在客户端显示的响应。

stackoverflow 上的几个条目(例如 thisthis )很有趣,但也没有回答我的问题,关于 asynchronous methods 的教程也没有回答我。 。

<小时/>

更新:由于有几个人指出该问题可能与我的测试方式有关,因此我尝试使用不同的浏览器运行它。有趣的是,我在 Chrome 和 Firefox 上都遇到了同样的问题。但是,当执行每个请求时,它显示了预期的行为(并行处理请求)——所以我被浏览器愚弄了......

最佳答案

你写道:

Since I already learned that a @RestController will be instantiated as singleton, it is clear for me, that multiple requests (which are handled by the same method) will be processed sequentially.

...将按顺序处理” - 这是错误的陈述。我什至不知道它是根据什么制定的。在使方法同步(或使用其他锁定技术)之前,多个线程可以同时访问它。

在第二种情况下,您刚刚将其配置为为每个请求创建新实例。我只有一个想法来解释为什么您在调试器中收到顺序结果:您也按顺序从浏览器执行此请求。

如果您想测试即使在第一种情况下如何完美处理多个请求,只需在浏览器中打开单独的选项卡并几乎同时启动请求即可。

关于java - 如何使用SpringBoot的@RestController并行处理多个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42176468/

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