【发布时间】:2020-03-20 17:43:51
【问题描述】:
我已经使用 Project Reactor 实现了服务器发送事件,用于设置从服务器到客户端的单向通信。
在服务器上,我添加了一个字符串类型的磁通连接:
Flux<String> addDataConnection() {
return Flux.create(emitter -> {
fluxSinks.add(emitter);
});
}
每当我收到消息时,它都会传播消息:
void propagateMessage(String messageContent) {
fluxSinks.parallelStream()
.forEach(fluxSink -> fluxSink.next(messageContent));
}
此数据来自外部来源,因此传入事件的频率超出了我的控制范围。
因此,我添加了一个额外的心跳流,我将它与我的数据连接流合并。这样,我既可以保持连接活动,也可以检测终止的连接,例如当浏览器窗口关闭时:
Flux.interval(Duration duration) 实际上返回一个 Long,但是我将它映射到一个 String 以匹配数据连接的类型安全。这个字符串实际上并没有被任何人使用
Flux<String> addHeartbeat() {
return Flux.interval(Duration.ofSeconds(2))
.map(i -> "heartbeat");
}
我的问题是关于助焊剂的元素类型。由于我现在在我的数据连接上返回字符串,我可以简单地从心跳返回一个字符串,因此从通量的合并中返回一个 Flux<String>:
Flux<String> initiateFluxStreams() {
return Flux.merge(addDataConnection(), addHeartbeat());
}
但是,如果我的数据流返回一个更复杂的对象并且我想确保通量合并方法中的类型安全怎么办?
我总是可以返回一个类型 Flux<?> 来让我的编译器满意,但我对这个解决方案并不满意,因为它允许我(或其他人)返回他们想要的任何东西。
通量的合并是否支持更详细的编译安全性?
编辑:我在https://stackoverflow.com/a/49082329/3432964 看到了答案,以及它如何使用<? extends someMarkerInterface> 作为类型。这是我唯一的选择吗?将整个内容包装在ServerSentEvent-object 中是否更好?
【问题讨论】:
标签: java spring-webflux project-reactor