给出一个简单的控制器,其方法如下:
@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秒抛出上述异常。引擎盖下发生了什么?
答案 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));