【问题标题】:Reactor fireAndForget Mono pass contextReactor fireAndForget Mono 传递上下文
【发布时间】:2021-10-13 07:27:01
【问题描述】:

我正在尝试将订阅者 Context 传递给在 doOnNext 内部调用的 fireAndForget 方法。 fireAndForget 也是异步非阻塞运行的。如何传递此上下文以使“键”的值存在?当我运行以下测试时,它通过了。但是,在日志中我可以看到doOnNext 我得到了:

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.util.NoSuchElementException: 上下文为空

@Test
void shouldPassContextToFireAndForget() {
  final Mono<String> helloWorldMono = Mono.just("hello")
      .doOnNext(this::fireAndForget)
      .doOnNext(name -> Mono.deferContextual(contextView -> fireAndForget(contextView, name)).subscribe())
      .flatMap(name -> Mono.deferContextual(contextView -> Mono.just(name + " " + contextView.get("key"))))
      .contextWrite(Context.of("key", "world"));

  StepVerifier.create(helloWorldMono)
      .expectNext("hello world")
      .verifyComplete();
}

private Mono<String> fireAndForget(ContextView context, String name) {
  return Mono.just(name)
      .flatMap(value -> Mono.deferContextual(contextView -> Mono.just(value + contextView.get("key"))))
      .contextWrite(context);
}

private void fireAndForget(String name) {
  Mono.just(name)
      .flatMap(value -> Mono.deferContextual(contextView -> Mono.just(value + contextView.get("key"))))
      .subscribe();
}

【问题讨论】:

    标签: java reactive-programming project-reactor


    【解决方案1】:

    Context 是一个订阅时间的概念。有两种可能的方法。

    您可以使用transformDeferredContextualContextView 暴露在链的中间:

     final Mono<String> helloWorldMono = Mono.just("hello")
                .transformDeferredContextual((original, cntx) -> original.doOnNext(name-> fireAndForget(cntx, name).subscribe()))
                .flatMap(name -> Mono.deferContextual(contextView -> Mono.just(name + " " + contextView.get("key"))))
                .contextWrite(Context.of("key", "world"));
    
    

    或者,您可以利用Mono.deferContextual 在链的开头公开ContextView,如下所示:

     final Mono<String> helloWorldMono = Mono.deferContextual(context ->
            Mono.just("hello")
                .doOnNext(name -> fireAndForget(context, name).subscribe())
                .flatMap(name -> Mono.just(name + " " + context.get("key")))
        ).contextWrite(Context.of("key", "world"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多