当前位置: 首页 > 知识库问答 >
问题:

WebFlux/反应器:使用doOn完成在Flux执行之前检查条件

刘翔宇
2023-03-14

我已经在用Flux查询一些外部资源了。使用()。现在我想实现一种乐观锁定:在查询开始执行之前读取一些状态,并检查它是否在查询完成后更新。如果是这样,抛出一些异常以中断http请求处理。

我通过使用doOnComplete实现了这一点:

final AtomicReference<String> initialState = new AtomicReference<>();

return Flux.just("some", "constant", "data")
    .doOnComplete(() -> initialState.set(getState()))
    .concatWith(Flux.using(...)) //actual data query
    .doOnComplete(() -> {if (!initialState.get().equals(getState())) throw new RuntimeException();})
    .concatWithValues("another", "constant", "data")

我的问题:

  1. 正确吗?是否保证在通量之前完成第一个λ。使用(),是否保证在之后严格执行第二个doOnCompletelambda
  2. 是否存在更优雅的解决方案

共有1个答案

巫马玉堂
2023-03-14

第一个doOnComplete将在Flux之后执行。仅(“some”、“constant”、“data”)发出所有元素,在发出后的第二个元素在concatWith中定义,并成功完成。这是可行的,因为两个出版商都有有限数量的元素。

然而,在所提出的方法中,来自特定操作的前置/后置条件在更高级别的操作之外处理。换句话说,属于操作的条件检查泄漏到通量定义中。

建议,将条件检查下推至操作:

var otherElements = Flux.using( // actual data query
        () -> "other",
        x -> {
            var initialState = getState();
            return Flux.just(x).doOnComplete(() ->
                { if (!initialState.equals(getState())) throw new IllegalStateException(); }
            );
        },
        x -> { }
);

Flux.just("some", "constant", "data")
        .concatWith(otherElements)
        .concatWith(Mono.just("another")) // "constant", "data" ...

 类似资料:
  • 问题内容: 我已经与SwingWorker一起工作了一段时间,并最终出现了奇怪的行为,至少对我而言。我清楚地了解,由于性能原因,一次调用中合并了多个对publish()方法的调用。这对我来说非常有意义,我怀疑SwingWorker会保留某种队列来处理所有调用。 根据教程和API,当SwingWorker结束执行时,doInBackground()正常完成,或者从外部取消了工作线程,然后调用done

  • 我正在使用Spring Webflow R2DBC将一些数据插入数据库。 要求提供数据- 控制器 服务 道 主要问题是我不知道如何让它等待所有结果返回并添加到最终

  • 问题内容: 所述javax.servlet.Filter的对象可以用于认证使用二者(其中过滤器需要赶上请求需要做任何servlet工作需要之前)和XSLT转换(其中的servlet需要是完全完成生成的内容)。它什么时候真正执行? 我知道这是依赖于实现的(在Web容器上),但这似乎是所有问题都需要解决的问题。 也许在某个地方为每个向Web容器注册的过滤器设置了一个配置选项? 额外: 另外,什么决定了

  • 我还尝试了一个flatMap()和一个mono.subscriberContext(),但我不确定如何正确地插入过滤器(特别是在错误的情况下)。 实现这一目标的最佳方法是什么?

  • 您的Google Maps代码结构如下所示: 回调? JavaScriptpromise? 您能想到的其他方法吗? 同样,这里所建议的信号量是一种可行的方法吗?