亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring 5 反應式 websockets:客戶端沒有從熱流中接收到相同的數據

Spring 5 反應式 websockets:客戶端沒有從熱流中接收到相同的數據

qq_花開花謝_0 2022-07-20 19:28:57
我的WebSocketHandler實現中有這個:@Overridepublic 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()它來使它成為熱流。我創建了一個單元測試,它啟動了 2 個線程,這些線程在返回的內容上執行此操作Flux:flux.log().handle((s, sink) -> {            LOGGER.info("{}", s.getMachineSpeed().getCurrent());        }).subscribe();在這種情況下,我看到兩個線程每秒都打印出相同的值。但是,當我打開 2 個瀏覽器選項卡時,我在兩個網頁中看不到相同的值。連接的 websocket 客戶端越多,值之間的差異就越大(因此原始 Flux 中的每個值似乎都發送到不同的客戶端,而不是發送到所有客戶端)。
查看完整描述

1 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

問題是對于每個連接的 websocket 客戶端,我都會調用該service.subscribeToEfficiencyData(id)方法,每次調用它都會返回一個的Flux。因此,當然,這些獨立的 Flux 不會在不同的 websocket 客戶端之間共享。

為了解決這個問題,我Flux在構造函數或PostConstruct我的服務的方法中創建實例,以便subscribeToEfficiencyData每次都返回相同的 Flux 實例。

請注意,.publish().autoConnect()在 Flux 上仍然很重要,因為沒有那個 websocket 客戶端將再次看到不同的值!


查看完整回答
反對 回復 2022-07-20
  • 1 回答
  • 0 關注
  • 79 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號