我正在将 RESTEasy Reactive 与 MongoDB / Panache 一起使用,并且我试图了解 .stream() 方法的要点(使用 REST 时)。
在几个示例中(quarkus docs、video、medium 文章等),Multi 用作 GET 请求的返回值。既然 HTTP 调用是一次性调用,这有什么意义?
我尝试延迟多流的每个项目,但正如我所料,我只有在 5 秒结束后才得到响应:
@GET
@Path("stream")
public Multi<Integer> streamTest() {
return Multi.createFrom()
.items(1, 2, 3, 4, 5)
.onItem().call(i -> {
Duration delay = Duration.ofSeconds(1);
return Uni.createFrom().nullItem().onItem().delayIt().by(delay);
});
}
我错过了什么? 🤔
我已经使用快速入门之一测试了您的代码,我认为您没有将其视为流的原因是因为标头和您用来读取响应的客户端。
当我在 Firefox 中打开它时,它工作得很好,但当我在终端中使用 Httpie 阅读它时,它就不行了。
如果您更改代码并在其顶部添加一个空的
@Produces
注释,它应该对所有客户端按预期工作,因为响应标头现在将是 text/event-stream
:
@GET
@Path("stream")
@Produces(MediaType.SERVER_SENT_EVENTS) // or just @Produces
public Multi<Integer> getStream() {
return Multi.createFrom()
.items( 1, 2, 3, 4, 5 )
.onItem().call( i -> {
Duration delay = Duration.ofSeconds( 2 );
return Uni.createFrom().nullItem().onItem().delayIt().by( delay );
} );
}
因此,这实际上是为了确保响应使用适合您的用例的正确标头。
也就是说,您说的其他一切都有道理。目前,在数据库上运行查询不会返回流,因此返回 Multi 通常没有帮助。这就是为什么 Panache 和 Hibernate Reactive 中的 API 用于查询返回 Uni。
我能想到的 Multi 的一个用例是当您有消息驱动的应用程序时。在这种情况下,您可能希望在通道上收到消息后立即更新网页或某些其他组件。 指南中有一个使用 Quarkus 和 Kafka 的示例。