spring-mvc - Spring Boot 2 中的侵入性 AsyncRequestTimeoutException

标签 spring-mvc spring-boot server-sent-events

有人可以向我解释一下这个异常的原因以及如何有效地解决它吗?我不想实现 here 提供的解决方案因为它可能会产生一些副作用。当 Controller 的处理程序返回 SseEmitter 时,会发生此异常。

@GetMapping("/sse")
SseEmitter registerClient(){
  SseEmitter emitter = new SseEmitter()
  return emitter;
}

上面的代码导致:

org.springframework.web.context.request.async.AsyncRequestTimeoutException: null
    at org.springframework.web.context.request.async.TimeoutDeferredResultProcessingInterceptor.handleTimeout(TimeoutDeferredResultProcessingInterceptor.java:42)
    at org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterTimeout(DeferredResultInterceptorChain.java:79)
    at org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$5(WebAsyncManager.java:426)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onTimeout(StandardServletAsyncWebRequest.java:151)
    at org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:44)
    at org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:136)
    at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:153)
    at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:236)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
2018-08-25 | 20:49:00.116 | http-nio-8080-exec-3 |  WARN | o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver | Resolved exception caused by Handler execution: org.springframework.web.context.request.async.AsyncRequestTimeoutException

谢谢

最佳答案

如果您在 SseEmitter 上调用“complete”,您可以防止 org.springframework.web.context.request.async.AsyncRequestTimeoutException

SseEmitter sseEmitter = new SseEmitter(1L);
sseEmitter.onTimeout(sseEmitter::complete); // prevent AsyncRequestTimeoutException on timeout

关于spring-mvc - Spring Boot 2 中的侵入性 AsyncRequestTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52029329/

相关文章:

java - jersey sse 不适用于 Wildfly 8.2

ios - iOS 上服务器发送事件的 webkit 推荐替代方案

java - 枚举值作为下拉列表

java - 我可以在 Spring MVC 的 RequestMapping 中使用 JSON 数据吗

elasticsearch - 我可以在Spring Data ElasticSearch中使用唯一组合字段吗?

javascript - 了解如何将 Redis 与 Node.js 和服务器发送事件一起使用

java - 为什么 Spring Boot 1.5 @Controller 中的 String 参数始终为 null?

java - Spring 4.0.2中如何在@Scheduled方法中获取当前 session (HttpSession)对象?

java - 如何使用 Spring Boot Rest Controller 返回 JSONArray?