我有下面的Quarkus资源,这将产生没有事件名称而只有数据部分的事件。
@Path("/myResource")
class MyResource {
@GET
@Path("/eventStream")
@Produces(MediaType.SERVER_SENT_EVENTS)
@SseElementType(MediaType.APPLICATION_JSON)
fun stream(): Multi<MyDto> = deviceStatusService.getStream()
}
这将产生没有事件名称的事件,只有数据部分。我如何指定事件名称?
我的最终代码是现在。
@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())
}
}
根据对问题的评论,看起来它在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对象来构建事件,虽然这也是一个临时的解决方案。