Java Spring引导延迟结果在响应中给出AsyncRequestTimeoutException?

Java Spring引导延迟结果在响应中给出AsyncRequestTimeoutException?,java,spring-boot,spring-mvc,Java,Spring Boot,Spring Mvc,我正在开发一个SpringBoot应用程序,其中有一个业务需求,我必须不断调用一个外部API,直到我从中获得Http状态204没有内容为止。然而,这个过程非常耗时,所以我在我的控制器方法中使用延迟结果,这样我可以释放服务器线程,但保持浏览器连接活动。 但是在到达我的应用程序的端点之后,我会在一段时间后得到这个异常的响应 { "timestamp": "2020-11-08T12:43:31.560+0000", "status&q

我正在开发一个SpringBoot应用程序,其中有一个业务需求,我必须不断调用一个外部API,直到我从中获得Http状态204没有内容为止。然而,这个过程非常耗时,所以我在我的控制器方法中使用延迟结果,这样我可以释放服务器线程,但保持浏览器连接活动。 但是在到达我的应用程序的端点之后,我会在一段时间后得到这个异常的响应

{
    "timestamp": "2020-11-08T12:43:31.560+0000",
    "status": 503,
    "error": "Service Unavailable",
    "message": "No message available",
    "trace": "org.springframework.web.context.request.async.AsyncRequestTimeoutException\r\n\tat org.springframework.web.context.request.async.TimeoutDeferredResultProcessingInterceptor.handleTimeout(TimeoutDeferredResultProcessingInterceptor.java:42)\r\n\tat org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterTimeout(DeferredResultInterceptorChain.java:79)\r\n\tat org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$5(WebAsyncManager.java:424)\r\n\tat java.util.ArrayList.forEach(ArrayList.java:1249)\r\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onTimeout(StandardServletAsyncWebRequest.java:150)\r\n\tat org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:44)\r\n\tat org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:133)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:153)\r\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:241)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.lang.Thread.run(Thread.java:745)\r\n",
    "path": "/api/datasync"
}
但是,调用外部API并使用响应的过程即使在获得上述错误响应后仍将继续。但是,server.log中不会记录任何异常或错误

这是我的控制器功能

@GetMapping("/documentinfo/datasync")
    public DeferredResult<ResponseEntity<String>> getData(@RequestParam(name = "update", required = false, defaultValue = "no") String manuallyInvoked) throws Exception {
            log.info("Inside getData Method. Delegating request to Service Layer");
                    log.info("Manually invoked by user");
                    
                    DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
                    ForkJoinPool forkJoinPool = new ForkJoinPool();
                    forkJoinPool.submit(() -> {
                        log.info("Inside Pool");
                        result.setResult(new ResponseEntity<String>(dataImportService.getData(),HttpStatus.OK));
                    });
                    
                    log.info("Finished Importing data");
                    return result; 
}
@GetMapping(“/documentinfo/datasync”)
public DeferredResult getData(@RequestParam(name=“update”,required=false,defaultValue=“no”)字符串手动调用)引发异常{
log.info(“内部getData方法。将请求委托给服务层”);
log.info(“用户手动调用”);
DeferredResult=新的DeferredResult();
ForkJoinPool ForkJoinPool=新的ForkJoinPool();
forkJoinPool.submit(()->{
日志信息(“池内”);
setResult(新的ResponseEntity(dataImportService.getData(),HttpStatus.OK));
});
log.info(“已完成导入数据”);
返回结果;
}

这里dataImportService.getData()是我的服务层方法,它调用队列并使用数据。

我认为您在方法执行过程中提供了一些延迟。这意味着在这个方法中使用一个线程。根据我的意见,问题是你没有给足够的时间来处理这个方法。@BawanthaWickramarachchi不,我没有添加任何交易。服务层中的方法很简单,它调用外部API并保存responseYeah,这可能就是问题所在。为了调用外部API,您必须为此留出一些时间。请参阅java中的异步方法。这是此类方法中使用的技术。但即使在获得错误响应后,该过程仍将继续,并从外部API获取数据并将其保存到数据库中。