我使用带有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);
我发现 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风格的“墙”或一个股票报价器,在这个例子中,每当某个数据发生变化时,服务器就会向客户机“推送”