我正在使用Spring Rest API来创建应用程序。我面临一个奇怪的问题,一次只有一个Thread能够访问Controller方法。 以下是代码段。
如果调用了多个rest服务,即getSample,那时只有1个Thread正在执行此方法,其余的线程正在等待完成。它与同步方法的工作相同
提前致谢。
@RestController
Class Sample {
@RequestMapping(value = "/controller/sample", method = RequestMethod.POST)
@ResponseBody
public Object getSample(@RequestBody String input) {
System.out.println("Hello World !!")
}
}
答案 0 :(得分:0)
在阅读以下博客后,我正在编辑我的答案。 https://studiofreya.com/2012/02/06/spring-mvc-how-to-build-a-thread-safe-controller/
Spring的Rest控制器/控制器默认是一个bean,单例作用域。 在组件扫描时,它将只创建具有默认范围的控制器bean。
为了使其成为mutithreded,我们需要改变范围!
问题的解决方案如下:
使用@Scope(“请求”)或@Scope(“会话”)注释控制器
将私有变量移动到其中一个方法中,或将其保存在会话或模型中。
阅读共享链接。 希望它有所帮助!
答案 1 :(得分:0)
它是多线程的,使用类似的东西来测试它
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />
<div class="mainfooter-area">
<div class="container-fluid">
<div class="row mx-md-5">
<div class="col-md-3 col-sm-12">
<div class="ll-footer-about text-center text-md-left">
<h2>About</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid animi aut cumque eligendi exercitationem molestiae molestias natus nisi odio officia perspiciatis quo repellendus saepe soluta sunt suscipit, tenetur! Commodi, distinctio.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur ducimus, odit tempora ullam Lorem ipsum dolor sit amet, consectetur adipisicing elit. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem, ipsam. Lorem ipsum dolor
sit amet, consectetur adipisicing elit. Placeat, quas!
</p>
</div>
</div>
<div class="col-md-3 col-sm-12">
<div class="ll-footer-ourcompany text-md-left text-center pl-0">
<h2>Our Company</h2>
<a href="">How to join us</a>
<a href="">How it work</a>
<a href="">Buying and Selling</a>
<a href="">Testimonial</a>
<a href="">Copyright Notice</a>
<a href="">Refund Policy</a>
<a href="">Affiliates</a>
</div>
</div>
<div class="col-md-3 col-sm-12">
<div class="ll-footer-faq text-md-left text-center pl-0">
<h2>Help and Faq</h2>
<a href="">How to join us</a>
<a href="">How it work</a>
<a href="">Buying and Selling</a>
<a href="">Testimonial</a>
<a href="">Copyright Notice</a>
<a href="">Refund Policy</a>
<a href="">Affiliates</a>
</div>
</div>
<div class="col-md-3 col-sm-12 text-md-left text-center">
<h2>Subscribe</h2>
<div class="ll-footer-newsletter">
<p>Subscribe to get the latest news, update and offer <br/> information. Don't worry, we won't send spam!
</p>
<!--Footer Newsletter Subscription-->
<div class="ll-subscription">
<form autocomplete="off" action="/subscribe" method="post">
<div class="ll-flex">
<div style="flex: 1 1 0%;">
<input type="email" name="email" placeholder="john@example.com">
</div>
<div style="margin-left: -20px;">
<button type="submit" disabled="disabled">→</button>
</div>
</div>
</form>
</div>
<!--End Footer Newsletter Subscription-->
<!--Footer Social Media-->
<div class="ll-socialmedia">
<a class="social-facebook" href=""><i class="fa fa-facebook"></i></a>
<a class="social-twitter" href=""><i class="fa fa-twitter"></i></a>
<a class="social-instagram" href=""><i class="fa fa-instagram"></i></a>
<a class="social-googleplus" href=""><i class="fa fa-google-plus"></i></a>
<a class="social-pinterest" href=""><i class="fa fa-pinterest-p"></i></a>
</div>
<!--End Footer Social Media-->
</div>
</div>
</div>
</div>
</div>
多次打电话,你会看到一些'Hello World !!'第一
答案 2 :(得分:0)
REST控制器是多线程默认情况下,如
DisptcherServlet
处理来自客户端的多个请求 同时使用各自的控制器方法。您 可以参考请求处理流程at official Spring MVC docs
在您的情况下,如果第一个线程阻塞了每个其他传入请求,那么您将遇到某种配置,JVM或资源问题。可能您的Web服务器或应用程序在线程池中没有足够的线程,或者您的防火墙正在愚弄。
无论如何,问题很可能就在那里。