事件源待定 - 泽西 Java 服务器
Event source pending - Jersey Java server
先了解一些上下文。在服务器端,我使用的是 Jersey 2.28 并包含 jersey-media-sse
作为依赖项
服务器端代码如下所示
@GET
@Path("{id}")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void orderUpdates(@PathParam("id") String id, @Context SseEventSink sink) {
service.subscribe(id, sink, sse);
OutboundSseEvent initialMessage = sse.newEventBuilder().comment("Connection initiated").build();
sink.send(initialMessage);
}
客户端代码是 - 在 js
this.eventSource = new EventSource(URL);
this.eventSource.onmessage = e => console.log(JSON.stringify(e));
但是连接总是停留在(待定)状态,即使通过附加调试器我看到服务器代码已执行。
正在调试另一个成功使用 sse 的项目(具有相同的依赖项),并且断点位于 sink.send(..)
我发现在我的案例中没有填充 SseEventSink 的以下字段
- 请求范围
- 请求上下文
- 响应上下文
- connectionCallback
我仍然没有弄清楚为什么,或者即使这就是请求被挂起的原因。
原来问题是由在 servlet 上启用并匹配 SSE 端点的 GZip 过滤器引起的。
禁用过滤器可以解决问题,它的行为符合预期。
先了解一些上下文。在服务器端,我使用的是 Jersey 2.28 并包含 jersey-media-sse
作为依赖项
服务器端代码如下所示
@GET
@Path("{id}")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void orderUpdates(@PathParam("id") String id, @Context SseEventSink sink) {
service.subscribe(id, sink, sse);
OutboundSseEvent initialMessage = sse.newEventBuilder().comment("Connection initiated").build();
sink.send(initialMessage);
}
客户端代码是 - 在 js
this.eventSource = new EventSource(URL);
this.eventSource.onmessage = e => console.log(JSON.stringify(e));
但是连接总是停留在(待定)状态,即使通过附加调试器我看到服务器代码已执行。
正在调试另一个成功使用 sse 的项目(具有相同的依赖项),并且断点位于 sink.send(..)
我发现在我的案例中没有填充 SseEventSink 的以下字段
- 请求范围
- 请求上下文
- 响应上下文
- connectionCallback
我仍然没有弄清楚为什么,或者即使这就是请求被挂起的原因。
原来问题是由在 servlet 上启用并匹配 SSE 端点的 GZip 过滤器引起的。
禁用过滤器可以解决问题,它的行为符合预期。