Flux + 服务器端事件
Flux + Server Side Events
我熟悉 Spring Flux + SSE,尝试编写一些流数据的代码。
这里有两个问题:
- 当我在 Chrome 中发出请求时,它不会关闭连接
一段时间(加载圈正在旋转),但我使用常规
Flux.fromIterable
在数组末尾发出完整信号。
关闭commection一段时间(约1分钟)。可能它在某处超时。只有在 OnComplete
事件触发时才应关闭响应。
@Controller("/")
@Validated
public class HelloController {
@Produces(MediaType.TEXT_EVENT_STREAM) // add 'application/stream+json'
@Get("/hello/{name}")
public Flux<Hello> hello(@NotBlank String name) {
List<Hello> list = new ArrayList<>();
list.add(new Hello("test1", 1));
list.add(new Hello("test2", 2));
return Flux.fromIterable(list).doOnComplete(() -> {
System.out.println("response should be closed here!");
});
}
}
-另外请添加对 application/stream+json
内容类型
的支持
-并通过 Flux 支持客户端的服务器端事件。
据我所知,内容类型 application/stream+json 不是官方媒体类型。有一个尝试注册此类型的草案,但它涉及 activity 流 https://tools.ietf.org/id/draft-snell-activity-streams-type-01.html
演示使用 MediaType.APPLICATION_JSON_STREAM 实现的用例,类型为 application/x-json-stream
至于为什么 chrome 一直在旋转,这是因为 Micronaut 实现了 keep alive 并使连接保持活动状态以满足进一步的请求
我熟悉 Spring Flux + SSE,尝试编写一些流数据的代码。
这里有两个问题:
- 当我在 Chrome 中发出请求时,它不会关闭连接
一段时间(加载圈正在旋转),但我使用常规
Flux.fromIterable
在数组末尾发出完整信号。 关闭commection一段时间(约1分钟)。可能它在某处超时。只有在
OnComplete
事件触发时才应关闭响应。@Controller("/") @Validated public class HelloController { @Produces(MediaType.TEXT_EVENT_STREAM) // add 'application/stream+json' @Get("/hello/{name}") public Flux<Hello> hello(@NotBlank String name) { List<Hello> list = new ArrayList<>(); list.add(new Hello("test1", 1)); list.add(new Hello("test2", 2)); return Flux.fromIterable(list).doOnComplete(() -> { System.out.println("response should be closed here!"); }); } }
-另外请添加对 application/stream+json
内容类型
-并通过 Flux 支持客户端的服务器端事件。
据我所知,内容类型 application/stream+json 不是官方媒体类型。有一个尝试注册此类型的草案,但它涉及 activity 流 https://tools.ietf.org/id/draft-snell-activity-streams-type-01.html
演示使用 MediaType.APPLICATION_JSON_STREAM 实现的用例,类型为 application/x-json-stream
至于为什么 chrome 一直在旋转,这是因为 Micronaut 实现了 keep alive 并使连接保持活动状态以满足进一步的请求