我是 Spring MVC 的新手,我在文档中没有找到任何相关信息。
假设我有一个 Controller /accounts 接受 POST 请求来创建一个帐户。
两个请求(几乎)同时使用相同的帐户 ID。
ASFAIK dispatcherServlet
管理请求。
是否在第一个请求完成之前将第二个请求放入队列? 或者会有两个线程同时处理两个请求?
更新:
查看Spring官方教程:Building a REST service .
有方法 add
的 Controller :
@RequestMapping(method = RequestMethod.POST)
ResponseEntity<?> add(@PathVariable String userId, @RequestBody Bookmark input) {
this.validateUser(userId);
return this.accountRepository
.findByUsername(userId)
.map(account -> {
Bookmark result = bookmarkRepository.save(new Bookmark(account,
input.uri, input.description));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(ServletUriComponentsBuilder
.fromCurrentRequest().path("/{id}")
.buildAndExpand(result.getId()).toUri());
return new ResponseEntity<>(null, httpHeaders, HttpStatus.CREATED);
}).get();
}
Controller 只是bean,默认情况下它们是单例的。 当同时接收到两个请求时,两个线程使用相同的 Controller 实例。假设第一个线程已经保存了新书签并正在执行
httpHeaders.setLocation(ServletUriComponentsBuilder
.fromCurrentRequest().path("/{id}")
.buildAndExpand(result.getId()).toUri());
同时第二个线程刚刚执行
Bookmark result = bookmarkRepository.save(new Bookmark(account,
input.uri, input.description));
在这种情况下,第一个线程将返回由第二个线程创建的 result.getId()).toUri()
。
它是正确的工作流程吗?这个 Controller 是线程安全的吗?
最佳答案
大多数 servlet 为每个传入请求启动一个单独的线程,Spring 也不异常(exception)。您需要确保共享 bean 是线程安全的。否则 Spring 会处理剩下的事情。
关于java - Spring Boot MVC Controller 是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30171027/