【问题标题】:Only 1 Thread accessing RestController Method [closed]只有1个线程访问RestController方法[关闭]
【发布时间】:2025-11-30 23:40:01
【问题描述】:

我正在使用 Spring Rest API 创建应用程序。我面临一个奇怪的问题,一次只有 1 个线程能够访问 Controller 方法。 下面是代码sn-p。

如果调用了多个rest服务即getSample,此时只有1个线程在执行该方法,其余线程正在等待完成。与同步方法的工作相同

提前致谢。

@RestController
Class Sample {

    @RequestMapping(value = "/controller/sample",  method = RequestMethod.POST)
    @ResponseBody
    public Object getSample(@RequestBody String input) {
        System.out.println("Hello World !!")
    }
}

【问题讨论】:

  • 您能否分享一下,您如何得出结论认为它像同步方法一样工作?
  • 可能调用者是同步的?您是否尝试过使用多个浏览器选项卡和 GET 映射?
  • 这很奇怪。请分享修改后的 spring 文件(如果有)和/或 application.properties、pom.xml

标签: java spring spring-boot spring-restcontroller


【解决方案1】:

它是多线程的,使用类似的东西来测试它

@RestController
Class Sample {

@RequestMapping(value = "/controller/sample",  method = RequestMethod.POST)
@ResponseBody
public Object getSample(@RequestBody String input) {
    System.out.println("Hello World !!")
    Thread.sleep(4000);
    System.out.println("GoodBye World !!")
}
}

多次调用,您将看到一些“Hello World !!”首先。

【讨论】:

  • No.... 再见世界之后!!打印然后 Hello World 出现第二个线程
【解决方案2】:

阅读以下博客后,我正在编辑我的答案。 https://studiofreya.com/2012/02/06/spring-mvc-how-to-build-a-thread-safe-controller/

Spring 的 Rest 控制器/控制器默认是一个具有单例范围的 bean。 在组件扫描时,它只会创建具有默认范围的控制器 bean。

为了让它变得更加复杂,我们需要改变范围!

问题的解决方法如下:

  1. 使用@Scope(“request”) 或@Scope(“session”) 注释控制器

  2. 将私有变量移动到方法之一或保存在会话或模型中。

阅读分享的链接。 希望对您有所帮助!

【讨论】:

    【解决方案3】:

    REST 控制器是多线程的默认情况下,作为 DisptcherServlet 处理来自客户端的多个请求 同时使用相应的控制器方法提供服务。你 可以参考请求处理流程at official Spring MVC docs

    如果在您的情况下,第一个线程阻塞所有其他传入请求,那么您有某种配置、JVM 或资源问题。可能您的 Web 服务器或应用程序在线程池中没有足够的线程,或者您的防火墙正在鬼混。

    无论如何,很可能,问题就在那里。

    【讨论】:

      最近更新 更多