如何使用WebFlux解析不符合“服务器已发送事件”的事件流?

时间:2019-02-08 16:12:31

标签: spring docker spring-webflux

我正在尝试使用WebClient处理Docker /events端点。但是,它不符合text/eventstream约定,因为每个消息都由 2 个LF分隔。它只是将其作为一个JSON文档发送,再发送给另一个。

它还将MIME类型设置为application/json而不是text/eventstream

我正在考虑但尚未实现的是创建一个节点代理,该代理将添加所需的换行符并将其置于两者之间,但我希望避免这种变通方法。

1 个答案:

答案 0 :(得分:0)

与其尝试处理ServerSentEvent,不如将其作为String来接收。然后尝试将其解析为JSON(忽略可能会发生但我自己没有击中的失败

@PostConstruct
public void setUpStreamer() {
    final Map<String, List<String>> filters = new HashMap<>();
    filters.put("type", Collections.singletonList("service"));

    WebClient.create(daemonEndpoint)
        .get()
        .uri("/events?filters={filters}",
           mapper.writeValueAsString(filters))
        .retrieve()
        .bodyToFlux(String.class)
        .flatMap(Mono::justOrEmpty)
        .map(s -> {
            try {
                return mapper.readValue(s, Map.class);
            } catch (IOException e) {
                log.warn("unable to parse {} as JSON", s);
                return null;
            }
        })
        .flatMap(Mono::justOrEmpty)
        .subscribe(
            event -> {
                log.trace("event={}", event);
                refreshRoutes();
            },
            throwable -> log.error("Error on event stream: {}", throwable.getMessage(), throwable),
            () -> log.warn("event stream completed")
        );
}