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