【问题标题】:Server-sent-event received and immediately an error is caught causing SSE to close收到服务器发送事件并立即发现错误导致 SSE 关闭
【发布时间】:2018-05-01 12:43:25
【问题描述】:

我已经为我的 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"}

事件已打开,但随后立即报告错误。

【问题讨论】:

    标签: javascript java spring spring-boot server-sent-events


    【解决方案1】:

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

    自定义过滤器 -

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

    它弹出的错误是-

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

    我删除了自定义过滤器。它就像一个魅力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 2012-07-15
      • 1970-01-01
      • 2016-06-08
      相关资源
      最近更新 更多