[英]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.