1

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

这里有两个问题:

  1. 当我在 Chrome 中发出请求时,它有一段时间没有关闭连接(加载圈正在旋转),但我使用 Flux.fromIterable了在数组末尾发出完整信号的常规。
  2. 它会关闭一段时间(约 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 支持客户端的服务器端事件。

4

1 回答 1

2

据我所知,内容类型 application/stream+json 不是官方媒体类型。有一个草案试图注册这种类型,但它与活动流有关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 并保持连接处于活动状态以满足进一步的请求

于 2018-05-29T12:18:56.037 回答