在这种情况下,为什么反应堆doOnError没有得到执行?

问题描述

在这个示例中,我无法弄清楚为什么第一个doOnError代码没有得到执行,我有使用WebClient调用REST服务并以InputStream的形式返回响应的方法

public InputStream loadAsstream() throws IOException {
    PipedOutputStream osPipe = new PipedOutputStream();
    PipedInputStream isPipe = new PipedInputStream(osPipe);
    Mono<ClientResponse> mono = WebClient.builder()
            .baseUrl("http://localhost:8089/")
            .build()
            .get()
            .uri("/loadData")
            .accept(MediaType.ALL)
            .exchange()
            .doOnError(e -> LOG.error("first doOnError: ",e));
    Flux<DataBuffer> flux = DataBufferUtils.write(mono.flatMapMany(response -> response.body(BodyExtractors.toDataBuffers())),osPipe);
    flux.doOnError(e -> LOG.error("second doOnError: ",e))
            .doFinally(s -> LOG.debug("finally"))
            .subscribe(DataBufferUtils.releaseConsumer());
    return isPipe;
}

InputStream稍后将用于使用ObjectMapper反序列化POJO:

try (InputStream inputStream = loadService.loadAsstream()) {
      pojo = objectMapper.readValue(inputStream,SimplePojo.class);
} catch (IOException ex) {
      throw new RuntimeException(ex);
}

例如,如果服务不可用并且REST调用错误而失败,则第一个doOnError和第二个doOnError都将执行,但是如果我在反序列化期间遇到异常(在objectMapper.readValue内部),那么只有第二个doOnError被执行,请您帮我了解原因吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)