Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring5反应式WebSocket:客户端未从热流接收相同的数据_Java_Spring Webflux_Project Reactor - Fatal编程技术网

Java Spring5反应式WebSocket:客户端未从热流接收相同的数据

Java Spring5反应式WebSocket:客户端未从热流接收相同的数据,java,spring-webflux,project-reactor,Java,Spring Webflux,Project Reactor,我在我的WebSocketHandler实现中有这个: @Override public Mono<Void> handle(WebSocketSession session) { return session.send( session.receive() .flatMap(webSocketMessage -> { int id = Integer.parseInt(webSocketM

我在我的
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;
              })
    );
}
在本例中,我看到两个线程每秒打印出相同的值


但是,当我打开两个浏览器选项卡时,我在两个网页中看不到相同的值。连接的websocket客户端越多,值之间的距离就越大(因此原始流量中的每个值似乎都发送到不同的客户端,而不是发送到所有客户端)。

多亏了

问题是,对于每个连接的websocket客户端,我调用
service.subscribeToEfficiencyData(id)
方法,该方法每次调用时都返回一个新的流量。因此,当然,这些独立的流量不会在不同的websocket客户端之间共享

为了解决这个问题,我在构造函数中创建了
Flux
实例,或者在我的服务中创建了
PostConstruct
方法,以便
subscribeToEfficiencyData
每次都返回相同的Flux实例

请注意,Flux上的
.publish().autoConnect()
仍然很重要,因为没有它,websocket客户端将再次看到不同的值

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();
}
flux.log().handle((s, sink) -> {
            LOGGER.info("{}", s.getMachineSpeed().getCurrent());
        }).subscribe();