簡體   English   中英

Spring Webflux 端點作為主題工作

[英]Spring Webflux endpoint working as a topic

我有一個 Flux 端點,我提供給客戶(訂閱者)以接收更新的價格。 我正在測試它通過瀏覽器訪問 URL (http://localhost:8080/prices),它工作正常。 我面臨的問題(我可能在這里遺漏了一些概念)是當我在許多瀏覽器中打開這個 URL 並且我希望在所有瀏覽器中收到通知時,但只有一個收到。 它作為隊列而不是主題工作(如在消息代理中)。 這是正確的行為嗎?

@GetMapping(value = "prices", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<Collection<Price>>> prices() {
return Flux.interval(Duration.ofSeconds(5))
        .map(sec -> pricesQueue.get())
        .filter(prices -> !prices.isEmpty())
        .map(prices -> ServerSentEvent.<Collection<Price>> builder()
                .event("status-changed")
                .data(prices)
                .build());
}

get不是標准的隊列操作,但這幾乎可以肯定是因為您的pricesQueue.get()方法不是冪等的。 對於每個請求(在這種情況下,對於您打開的每個瀏覽器 window),您將獲得每 5 秒調用pricesQueue.get()的新通量。 現在,如果pricesQueue.get()只是檢索隊列中的最新項目並且不對其執行任何操作,那么一切都很好 - 您的所有訂閱者都會收到相同的項目,並顯示相同的項目。 但是,如果它更像是poll() ,它在檢索到隊列后刪除隊列中的項目,那么只有第一個通量會獲得該值 - rest 不會,因為到那時它將被刪除。

您在這里實際上有兩個主要選擇:

  • 更改您的get()實現(或實現一個新方法),以便它不會改變隊列,只檢索一個值。
  • 將助焊劑變成熱助焊劑。 Flux.interval(Duration.ofSeconds(5)).map(sec -> pricesQueue.get()).publish().autoConnect()為字段(假設為queueFlux ),然后返回queueFlux.filter(prices ->.prices.isEmpty()).map(...)在您的 controller 方法中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM