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

服务器从rest控制器发送了事件Spring Webflux返回事件名作为响应

周子平
2023-03-14

我使用带有reactor Flux的SSE来捕获linux系统指标并发布到浏览器(javascript eventsource)。

目前,问题是无法将特定数据发送到特定客户端。经过多个SO帖子后,它被告知在事件源中使用事件侦听器,来自服务器的响应应该在响应中使用事件作为键。

因为,我从服务器返回一个对象,所以将事件作为响应json中的键之一就足够了,它将由事件源标识。

在客户端设置一个唯一的数字,该数字将在json响应中的事件键中返回。

谢谢你的帮助!

Javascript:

jsonStreamObjectHeap.addEventListener("197e08e-f9a4-4e6e-9a04-220ade08a8f4",function(e){
        $.each(message, function(index, value) {
           /*some operation*/
        });
        }

来自Rest控制器的响应:

{
   "event":"197e08e-f9a4-4e6e-9a04-220ade08a8f4",
   "data":"2048"
}

Rest控制器代码:

 Flux<Long> interval = Flux.interval(Duration.ofSeconds(1));
        interval.subscribe((i) -> testStreamList.forEach(testStream -> {
            try {
                generateTestStream(testStream, UUID);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }));
 Flux<List<TestStream>> transactionFlux = Flux.fromStream(Stream.generate(() -> testStreamList));
 return Flux.zip(interval, transactionFlux).map(Tuple2::getT2);

共有1个答案

郦磊
2023-03-14

我发现 org.springframework.http.codec.ServerSentEvent 可以从 rest 控制器插入到您的 Flux 响应中。

  Flux<Long> interval = Flux.interval(Duration.ofSeconds(1));    
  Flux<HeapStat> transactionFlux = Flux.fromStream(Stream.generate(() -> heapStat));

  /*Bulding ServerSentEvent to from the tuple*/

  return Flux.zip(interval, transactionFlux).map(tuple->
           ServerSentEvent.<HeapStat>builder().event(jsessionId).data(tuple.getT2()).build()
                );

您可以准备与SSEEmmiter完全相同的响应,具有自定义事件名称Last-Event-ID

 类似资料:
  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • REST服务器可以配置为订阅从已部署的业务网络发出的事件,并发布这些业务事件供客户端应用程序使用。目前,REST服务器支持通过WebSockets向客户端应用程序发布事件。 客户端应用程序可以使用WebSocket客户端来订阅由REST服务器发布的业务事件。WebSocket客户端可用于所有主要编程语言和应用程序类型,例如客户端Web用户界面、后端服务器进程、移动应用程序和集成工具。 启用WebS

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 并在config/bootstrap.php中添加了以下行: 在config/events.php中 在lib/event/mylistener.php中 PS:我使用Cakephp事件是因为它允许我在一个地方从不同的控制器收集所需的数据,然后从那里,我可以创建事件流(服务器发送的事件)。如果有更好的选择,请分享。

  • http://www.html5rocks.com/en/tutorials/eventsource/basics/ 但是,我不明白一个重要的概念--是什么触发了服务器上导致消息发送的事件? 换句话说--在HTML5示例中--服务器只发送一次时间戳: 如果我建立一个实际的例子--例如,一个Facebook风格的“墙”或一个股票报价器,在这个例子中,每当某个数据发生变化时,服务器就会向客户机“推送”