【问题标题】:Proper reactive operator for two methods两种方法的正确反应运算符
【发布时间】:2021-12-08 13:24:31
【问题描述】:

我有两个相互依赖的方法。

Flux<DataBuffer> flux = service1.get();
Mono<String> s = service2.store(flux);

service1.get() 返回 Flux&lt;DataBuffer&gt;Flux.error 以防获取操作不成功。

service2.store(Flux&lt;DataBuffer&gt; flux)返回Mono&lt;String&gt;Mono.error以防存储操作不成功。

Service2 是响应式 feign 客户端,它将数据存储到文件并返回引用。

我需要让 service2 调用依赖于 service1,但我想保留参数 Flux 并只调用每个方法一次。 目的是打电话给service2.store,以防service1.get成功回复。

例如

public Mono<String> mainMethod() {
    return service1.get()
      .unknownOperator(flux -> service2.store(flux))
      .doOnError(e -> log.error(e.getMessage));
}

你能告诉我正确的运营商,而不是unknownOperator

错误应该这样处理:

  1. service1.get 中的错误应被记录并从 mainMethod 返回。无法调用service2.store
  2. 应该记录service2.store 中的错误并从mainMethod 返回。

【问题讨论】:

  • 您的问题不清楚,您谈论的是service1.getservice2.store,但稍后在最后一个示例中,您将调用service1.getservice.get(flux)。请更新您的问题以获得正确的代码示例,包括函数的所有返回类型。他们返回error 还是返回empty,如果不同部分出错,您希望如何处理错误。
  • 抱歉,我修复了示例,并添加了有关错误处理的详细信息。现在应该很清楚了。

标签: java spring-webflux project-reactor


【解决方案1】:

在 service2.store 中将 Flux 作为参数是不是也很奇怪?我猜你只是想做service1.get().collectList(),所以你有一个服务1结果的单声道。 之后你可以做一个平面图吗?例如

service1.get()
    .collectList()
    .flatmap(service2::store) // .flatmap(list -> service2.store(list)
    .doOnError(e -> log.error(e.getMessage))

【讨论】:

  • 传递列表的问题是您需要将整个列表存储在内存中,这可能导致大文件出现 OOM 错误。然后最好流式传输每个字节缓冲区
  • 有道理,但他是否应该将DataBuffer 作为参数而不是Flux&lt;DataBuffer&gt;?我看到很多开始 ppl 将 Flux 的 Mono 作为参数传递给方法,但是如果您正确设置管道/流或相应地调整代码,则不需要(?)。在某些情况下,您将 Flux 或 Mono 作为参数传递,但还没有遇到它们,所以我在那部分可能是错误的
  • 传递一个生产者本身并没有错,只要确保链是完整的,以便反应器可以组装
  • @Toerktumlare 你能指定如何实现吗?
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多