Flux + 服务器端事件

Flux + Server Side Events

我熟悉 Spring Flux + SSE,尝试编写一些流数据的代码。

这里有两个问题:

  1. 当我在 Chrome 中发出请求时,它不会关闭连接 一段时间(加载圈正在旋转),但我使用常规 Flux.fromIterable 在数组末尾发出完整信号。
  2. 关闭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

测试https://github.com/micronaut-projects/micronaut-core/commit/b71f63aa8f2b2f00bdcbc25e60d9112321d8f003#diff-29dce542bb2e6326257895b376220c1aR16

演示使用 MediaType.APPLICATION_JSON_STREAM 实现的用例,类型为 application/x-json-stream

至于为什么 chrome 一直在旋转,这是因为 Micronaut 实现了 keep alive 并使连接保持活动状态以满足进一步的请求