REST控制器是多线程的吗?

Hum*_*erd 7 java spring

我一直在做这个关于如何返回异步可调用对象的教程.它按预期工作.但是当第一个请求休眠5秒钟时,我得到了第二个请求,控制器在处理第二个请求之前等待先前的芬兰请求.

如何让控制器立即处理每个请求并在后台进行睡眠?

@编辑

示例:想象一下这样一种情况,即我的控制器需要向外部api发出请求,并根据其响应它应该发送自己的响应.外部api调用需要2秒钟.我希望我的应用程序的用户只等待2.5秒,而不是放在队列中,因为控制器一次只能处理一个请求.

dev*_*per 12

REST控制器是多线程的吗?

REST控制器是多线程的,因为它同时DisptcherServlet处理来自客户端的多个请求,并使用相应的控制器方法.您可以在此处参考请求处理流程

如何让控制器立即处理每个请求并在后台进行睡眠?

你可以通过返回Callable<String>Spring控制器方法来做到这一点,如下所示:

@Controller
public class MyController {

    @RequestMapping(value="/sleep")
    public Callable<String> myControllerMethod() {
        Callable<String> asyncTask = () -> { try {
            System.out.println(" WAITING STARTED:"+new Date());
            Thread.sleep(5000);
            System.out.println(" WAITING COMPLETED:"+new Date());
            return "Return";//Send the result back to View Return.jsp
        } catch(InterruptedException iexe) {
            //log exception
            return "ReturnFail";
        }}; 
    return asyncTask;
  }
Run Code Online (Sandbox Code Playgroud)

输出:

等待开始:2016年11月24日星期四21:03:12 GMT

等待完成:2016年11月24日星期四21:03:17 GMT

在此之后,视图将返回"Return.jsp"页面.

这里,控制器方法将在一个单独的线程中运行(释放实际的servlet线程),一旦任务完成,Result将再次发送回客户端(View等..).

PS: 您需要添加@EnableAsync作为应用程序配置的一部分,您可以在此处查看.