收到了服务器推送的事件,但立即捕获到一个错误导致SSE关闭。

5
我已经为我的Spring Boot应用程序实现了一个端点,该端点返回服务器发送事件,我向其中发送了一些简单的字符串。当对此端点发出请求时,它会被打开,然后出现错误。我发送的字符串似乎没有到达前端。
以下是控制器代码:
@RequestMapping("/sseTest")
@Async
public ResponseBodyEmitter handleRequest() {
    final SseEmitter emitter = new SseEmitter();
    ExecutorService service = Executors.newSingleThreadExecutor();
    service.execute(() -> {
        for (int i = 0; i < 500; i++) {
            try {
                emitter.send(123 , MediaType.TEXT_PLAIN);
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
                emitter.completeWithError(e);
                return;
            }
        }
        emitter.complete();
    });
    return emitter;
}

处理请求的前端代码:

const eventSource = new EventSource('http://localhost:8080/sseTest');
eventSource.onopen = e => console.log('open');
eventSource.onerror = e => {
    if (e.readyState == EventSource.CLOSED) {
        console.log('close');
    } else {
        console.log(e);
    }
};
eventSource.onmessage = event => {
console.log(event.data);
};

控制台记录以下内容:
open
Event {type: "error"}

活动已经开始,但立即报错。
1个回答

1

我遇到了类似的问题。由于创建了自定义过滤器,因此它会要求添加异步支持。

自定义过滤器 -

@WebFilter(urlPatterns="/*")
@Component
public class SessionFilter implements Filter {

弹出的错误信息是 -

java.lang.IllegalStateException: 必须在servlet上启用异步支持,并且对于涉及异步请求处理的所有过滤器也必须启用异步支持。这可以通过使用Servlet API在Java代码中完成,或者通过在web.xml中添加“true”到servlet和过滤器声明中来完成。

我移除了自定义过滤器,问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接