如何在Quarkus中为服务器发送事件(SSE)设置事件名称

3

我有以下的Quarkus资源:

@Path("/myResource")
class MyResource {
    @GET
    @Path("/eventStream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    @SseElementType(MediaType.APPLICATION_JSON)
    fun stream(): Multi<MyDto> = deviceStatusService.getStream()
}

这将生成没有事件名称仅有数据部分的事件。我该如何指定事件名称?


你能具体说明你想在哪里为事件添加命名吗?你是想在前端订阅不同的事件,还是在后端拆分事件? - Dmytro Chaban
SSE规范允许使用命名事件。我想在前端使用例如evtSource.addEventListener("someEvent", (e) => alert(e.data))来分割事件。 - robbit
感觉在resteasy库中没有实现(或者我不知道),如果对你来说时间很紧迫,你可以尝试使用非响应式的方法,就像这个文档中所描述的:https://docs.jboss.org/resteasy/docs/3.5.1.Final/userguide/html/JAX-RS_2.1_additions.html#d4e1400 你可以使用sink和sse对象来发送事件,基本上你的方法将是void类型,并且你需要在那里订阅你的流 - Dmytro Chaban
3个回答

2

我的最终代码如下:

    @GET
    @Path("/eventStream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    @SseElementType(MediaType.APPLICATION_JSON)
    fun stream(@Context sse: Sse, @Context sseEventSink: SseEventSink) {
        deviceStatusService.getStream().subscribe().with { deviceStatus ->
            sseEventSink.send(sse.newEventBuilder()
                        .name("deviceStatus")
                        .data(deviceStatus)
                        .build())
        }
    }

1
根据问题的评论,看起来Resteasy库中没有实现此功能,一个选项是使用非响应式方法,例如:
    @GET
    @Path("/eventStream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    @SseElementType(MediaType.APPLICATION_JSON)
    fun stream(@Context sse: Sse, @Context sseEventSink: SseEventSink) { 
        return deviceStatusService.getStream().subscribe().asIterable().forEach { it -> sseEventSink.send(sse.newEvent("myEvent", it.toString()))}
    }

你可以使用OutboundSseEventImpl.BuilderImpl()来构建带有JSON对象的事件。尽管如此,这仍然是一个临时解决方案。

0

你需要返回一个 Multi\<OutboundSseEvent\>

@GET
@RestStreamElementType(MediaType.APPLICATION_JSON)
fun stream(@Context sse: Sse): Multi<OutboundSseEvent> {
  return quotes.map {
    sse.newEventBuilder()
      .data(it)
      .name("update")
      .build()
  }
}

整个班级都在这里

https://github.com/eduardo-villasboas/quarkus-poc/blob/server-sent-events/src/main/kotlin/quarkus/producer/QuotesProducer.kt

客户在同一个项目中

https://github.com/eduardo-villasboas/quarkus-poc/blob/server-sent-events/src/main/resources/META-INF/resources/quotes.html


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