Spring SseEmitter导致无法在响应提交异常后转发

时间:2015-04-26 16:33:21

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

给出一个简单的控制器,其方法如下:

@RequestMapping(method = RequestMethod.GET, value = "{id}/update")
public ResponseEntity<SseEmitter>  update() throws IOException {
    final SseEmitter  sseEmitter = new SseEmitter();

    return ResponseEntity.ok(sseEmitter);
}

我也是这样试过的:

@RequestMapping(method = RequestMethod.GET, value = "{id}/update")
public SseEmitter  update() throws IOException {
    final SseEmitter  sseEmitter = new SseEmitter();

    return sseEmitter;
}

但两种方式Tomcat 8.0.21在请求发出后30秒抛出上述异常。引擎盖下发生了什么?

2 个答案:

答案 0 :(得分:2)

这可能是servlet容器的默认异步超时。 您可以使用Spring更改默认值:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(1000000);
    }

}

答案 1 :(得分:2)

您可以在其构造函数中设置SseEmitter的超时:

final SseEmitter sseEmitter = new SseEmitter(60000L); // Timeout in millis

客户端将自动重新连接,但默认情况下会等待2-3秒。 您可以在发送消息时覆盖此信息:

// Instruct the client to reconnect after 500ms
emitter.send(SseEmitter.event().reconnectTime(500).data(message));
相关问题