当前位置: 首页 > 知识库问答 >
问题:

Spring Webfluxendpoint作为主题工作

翁心思
2023-03-14

我有一个流量endpoint,我提供给客户机(订户),以接收更新的价格。我正在测试它通过浏览器访问URL(http://localhost:8080/prices),它工作得很好。我面临的问题(我可能在这里遗漏了一些概念)是,当我在许多浏览器中打开这个URL,我希望在所有浏览器中都收到通知,但只有一个浏览器收到通知。它作为一个队列而不是一个主题工作(就像在message Brokers中一样)。那是正确的行为吗?

@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());
}

共有1个答案

干弘深
2023-03-14

get不是标准的队列操作,但这几乎是肯定的,因为pricesqueue.get()方法不是幂等的。对于每个请求(在本例中打开的每个浏览器窗口),您将获得一个新的流量,该流量每5秒调用pricesqueue.get()。现在,如果pricesqueue.get()只检索队列中的最新项而不对其执行任何操作,那么一切都很好--所有订阅者都收到相同的项,并且显示相同的项。但是,如果它的行为更像poll(),它在检索到队列中的项后删除该项,那么只有第一个流量会得到该值--其余的流量不会,因为到那时它已经被删除了。

这里有两个主要的选择:

  • 更改get()实现(或实现一个新方法),以便它不会改变队列,只检索一个值。
  • 把焊剂变成热焊剂。将flux.interval(duration.ofseconds(5)).map(sec->pricesqueue.get()).publish().autoconnect()存储为字段(假设为queueflux),然后在控制器方法中返回queueflux.filter(prices->!prices.isempty()).map(..)
 类似资料:
  • 如何更改MySQL Workbench设置,使其使用深色主题?

  • 我试图用Hazelcast Jet作为一个处理管道来获得更多的速度,并开始更多地挖掘源代码文档 我是不是误会什么了?

  • 我试图在Websphere Application Server中添加ActiveMQ作为JMS提供程序。 我已经按照这里描述的说明ActiveMQ5.11和WebSphere Application Server8.5,并根据主题进行了调整。 不幸的是,我不确定需要为主题连接工厂和主题定义在外部JNDI名称中添加什么。 根据IBM文档: “外部JNDI名称用于将队列绑定到应用程序服务器名称空间的

  • 我正在尝试自定义AlertDialog按钮的强调色。但它并没有产生任何影响,它似乎是从系统中继承了颜色。这是我的风格/主题。 这是我试图构建警报对话框的代码。 编辑1: 我尝试了使用的方法,但它给出了相同的结果。 编辑2: 我还尝试更改对话框的重音颜色,但没有看到该颜色: 即使这样也不会改变按钮文本的颜色:(。

  • 我正在尝试使用预定义的sql查询在Jasper报告服务器专业版上生成报告。 如何在jaspersoft studio设计器中创建主题以使用预定义的sql查询?

  • 我有一个BasicActivity,我想在用户点击浮动动作按钮时显示一个AlertDialog。当我在Fab上打卡时:应用程序停止,出现以下错误: 我尝试将活动的主题从(默认BasicActivity)更改为: 至 但当我打开它并出现以下错误时,整个活动就会停止: 我看到了许多关于这个错误的问题,但我仍然没有弄明白。我只使用了一个默认活动(BasicActivity),我想显示一个简单的Alert