【问题标题】:Is Mono.doFinally sufficient to handle release/cleanup?Mono.doFinally 是否足以处理发布/清理?
【发布时间】:2022-12-16 16:22:32
【问题描述】:

我正在尝试将资源与 spring webClient 同步:

this.semaphore.acquire()
webClient
    .post()
    .uri("/a")
    .bodyValue(payload)
    .retrieve()
    .bodyToMono(String.class)    
    // release
    .doFinally(st -> this.semaphore.release())
    .switchIfEmpty(Mono.just("a"))
    .onErrorResume(Exception.class, e -> Mono.empty())
    .doOnNext()
    .subscribe();

doFinally 是否足以处理发布? 如果不是,“逃生”点是什么?

【问题讨论】:

    标签: project-reactor spring-webclient


    【解决方案1】:

    如果您的单声道被取消、完成或出错,这将清理您的资源,这些都是单声道可以结束的方式。

    但是,一个 Mono 不一定非要结束,doFinally 钩子也不会被执行。

    所以在外部api响应失败的情况下,这取决于你的webClient是如何配置的: 通常,应该有超时和最大重试次数。在这种情况下,您的代码应该是正确的。

    注意:释放可能不会发生在与获取相同的线程上。根据资源的不同,这实际上可能是一个问题。例如,ReentrantReadWriteLock 的语义是它由创建它的线程拥有。我不知道你的信号量是否存在这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2014-04-29
      • 2020-09-12
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多