我正在尝试使用WebClient处理Docker /events
端点。但是,它不符合text/eventstream
约定,因为每个消息都由 2 个LF分隔。它只是将其作为一个JSON文档发送,再发送给另一个。
它还将MIME类型设置为application/json
而不是text/eventstream
。
我正在考虑但尚未实现的是创建一个节点代理,该代理将添加所需的换行符并将其置于两者之间,但我希望避免这种变通方法。
答案 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")
);
}