【发布时间】:2019-03-06 12:48:35
【问题描述】:
我的WebSocketHandler 实现中有这个:
@Override
public Mono<Void> handle(WebSocketSession session) {
return session.send(
session.receive()
.flatMap(webSocketMessage -> {
int id = Integer.parseInt(webSocketMessage.getPayloadAsText());
Flux<EfficiencyData> flux = service.subscribeToEfficiencyData(id);
var publisher = flux
.<String>handle((o, sink) -> {
try {
sink.next(objectMapper.writeValueAsString(o));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
})
.map(session::textMessage);
return publisher;
})
);
}
Flux<EfficiencyData> 当前在服务中生成用于测试,如下所示:
public Flux<EfficiencyData> subscribeToEfficiencyData(long weavingLoomId) {
return Flux.interval(Duration.ofSeconds(1))
.map(aLong -> {
longAdder.increment();
return new EfficiencyData(new MachineSpeed(
RotationSpeed.ofRpm(longAdder.intValue()),
RotationSpeed.ofRpm(0),
RotationSpeed.ofRpm(400)));
}).publish().autoConnect();
}
我正在使用publish().autoConnect() 使其成为热门流。我创建了一个单元测试,它在返回的Flux 上启动 2 个线程:
flux.log().handle((s, sink) -> {
LOGGER.info("{}", s.getMachineSpeed().getCurrent());
}).subscribe();
在这种情况下,我看到两个线程每秒都打印出相同的值。
但是,当我打开 2 个浏览器选项卡时,我在两个网页中看不到相同的值。连接的 websocket 客户端越多,值之间的差异就越大(因此原始 Flux 中的每个值似乎都发送到不同的客户端,而不是发送到所有客户端)。
【问题讨论】:
标签: java spring-webflux project-reactor