Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringMVC可调用执行即使在请求超时后仍继续?_Spring_Spring Mvc_Asynchronous - Fatal编程技术网

SpringMVC可调用执行即使在请求超时后仍继续?

SpringMVC可调用执行即使在请求超时后仍继续?,spring,spring-mvc,asynchronous,Spring,Spring Mvc,Asynchronous,我有这样一个异步handler方法 @RequestMapping("/custom-timeout-handling") public @ResponseBody WebAsyncTask<String> callableWithCustomTimeoutHandling() { Callable<String> callable = new Callable<String>() { public String call() th

我有这样一个异步handler方法

@RequestMapping("/custom-timeout-handling")
public @ResponseBody WebAsyncTask<String> callableWithCustomTimeoutHandling() {

    Callable<String> callable = new Callable<String>() {

        public String call() throws Exception {
            while(i==0){
            System.out.println("inside while loop->");
            }

            return "Callable result";
        }
    };

    return new WebAsyncTask<String>(10000, callable);
}

我的问题是,即使在超时(完成执行handletimeout方法)之后,响应也是从handletimeout方法发送的 while循环仍在处理,直到i的值更改为除零以外的其他值

请求是否仍由服务器保留?那么请求超时有什么用


提前感谢…

当servlet容器线程检测到异步可调用对象已超时时,它将调用handleTimeout()(在自己的上下文中)。这就是您看到handleTimeout()被执行的原因。它由servlet容器线程执行,而不是由运行可调用函数的线程执行

如果要自定义超时处理,需要做两件事:

  • 在WebAsyncTask中重写onTimeout()。当servlet容器线程检测到您的可调用项已超时时,将在该线程内调用您作为onTimeout()回调提供的任何可调用项
  • 检查您在控制器内创建的可调用项是否超时/中断。 如果您的可调用线程不期望并尊重中断(“如果目标线程不轮询中断状态,则中断被有效忽略”),则无法中断它!请参考答案,了解如何期待和尊重中断
  • public class TimeoutCallableProcessingInterceptor extends CallableProcessingInterceptorAdapter {
    
    @Override
    public <T> Object handleTimeout(NativeWebRequest request, Callable<T> task) throws Exception {
        throw new IllegalStateException("[" + task.getClass().getName() + "] timed out");
    }
    
    Thread.sleep(2000)
    
    while(i==0){
    System.out.println("inside while loop->");
    }