java - Spring Boot MVC Controller 是多线程的吗?

标签 java multithreading spring-mvc spring-boot

我是 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/

相关文章:

java - 在java中连接到SQL Server Native Client 10.0 OLE DB Provider

elasticsearch - 使用JAVA Api代码进行多个字段的Elastic Search文档更新的解决方案

java - @Aspect 方面的 Spring Autowiring bean 为空

java - Spring JAVAX 验证年份大于或等于当前年份

java - spring mvc - 在重定向期间保留http header

java - stopService后如何运行某些东西?

c - 如何知道线程是否处于死锁状态?

c - 用户级线程上下文切换 : How to detect when a thread is blocking in C?

multithreading - Thread_Guard类中std::thread引用的默认值是多少?

java - Jdbc模板增删改查操作