Как установить имя события для событий, отправленных сервером (SSE) в Quarkus - PullRequest
1 голос
/ 24 апреля 2020

У меня есть следующий ресурс Quarkus:

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

Это создаст события без имени события и только с разделом данных. Как я могу указать название события?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Мой окончательный код теперь:

    @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 голос
/ 24 апреля 2020

Согласно комментариям к вопросу, похоже, что он не реализован в библиотеке 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() для создания события с * 1006. * объект. Хотя, опять же, это временное решение

...