收到服务器发送事件并立即发现错误导致 SSE 关闭

Posted

技术标签:

【中文标题】收到服务器发送事件并立即发现错误导致 SSE 关闭【英文标题】:Server-sent-event received and immediately an error is caught causing SSE to close 【发布时间】: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"

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

【问题讨论】:

【参考方案1】:

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

自定义过滤器 -

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

它弹出的错误是-

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

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

【讨论】:

以上是关于收到服务器发送事件并立即发现错误导致 SSE 关闭的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:SSE 服务器发送的事件不起作用

Ktor sse 客户端断开连接

带有服务器发送事件的 JMeter 并行请求

SSE:服务器发送事件,使用长链接进行通讯

SSE 服务器发送事件 - 客户端不断发送请求(如池)

springboot 之 “服务端推送事件SSE(server-send-events)”