SargerasWang's Blog

我常常思考为什么鸟儿拥有整片天空,却常常停留在一个地方。然后我问了自己同样的问题。

SseEmitter DefaultHandlerExceptionResolver : Async Timeout for GET 解决

使用SpringMVC搭配HTML5的EventSourceSseEmitter如下:

1
2
3
4
5
@RequestMapping("connect")
public SseEmitter connect(){
    SseEmitter emitter = new SseEmitter();
    return emitter;
}

这样会抛出如下异常:

1
DefaultHandlerExceptionResolver : Async timeout for GET

原因是请求到timeout时间就会超时,new SseEmitter(long timeout);是可以设置timeout的,单位是毫秒,但是设置为60000L(一分钟),也是一样的,每分钟都会抛出这个异常.

最后解决办法,timeout永不过时,timeout设置为0,如下:

1
2
3
4
5
@RequestMapping("connect")
public SseEmitter connect(){
    SseEmitter emitter = new SseEmitter(0L);
    return emitter;
}

就不会抛出异常了,前端用类似如下代码即可:

1
2
3
4
5
6
7
8
9
10
11
var eventSource = new EventSource("/sse/connect");
eventSource.onmessage = function(event){
    //event.data 是数据
}
eventSource.onerror = function(err){
    if(err.target.readyState == 0){
        //消息服务异常,无法创建连接
    }if(err.target.readyState == 2){
        //消息服务断开,无法及时收到消息
    }
}