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

问题描述 投票:0回答:1

我有下面的Quarkus资源,这将产生没有事件名称而只有数据部分的事件。

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

这将产生没有事件名称的事件,只有数据部分。我如何指定事件名称?

server-sent-events quarkus
1个回答
1
投票

我的最终代码是现在。

    @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对象来构建事件,虽然这也是一个临时的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.