【问题标题】:How to enrich Reactor's Context with data from Mono?如何使用来自 Mono 的数据丰富 Reactor 的上下文?
【发布时间】:2021-05-21 12:23:09
【问题描述】:

有可能在订阅时使用一些数据来丰富 Reactor 的序列上下文,如下所示:

Mono.just("Hello")
    .flatMap(s -> Mono.deferContextual(ctx -> Mono.just(s + " " + ctx.get(key)))) 
    .contextWrite(ctx -> ctx.put(key, "World")); 

但是,这里的 "World" 是一种静态数据,在订阅时就知道了。

我想从初始 Mono 本身解析一个值并将其放入上下文中,以便下游操作员可以通过上下文 API 访问它。

我怎样才能正确地做到这一点?

我正在处理的用例如下:

  • 我通过异步 SDK 收到来自 AWS 的 SQS 消息,该消息解析为 Reactor 的 Mono
  • 消息中有一个correlation_id,我想在其中提取并将其放入 Reactors 上下文中,以使其对所有下游操作员可见。

【问题讨论】:

    标签: java project-reactor


    【解决方案1】:

    目前,使用我发现的初始 Mono 中的数据丰富 Reactor 上下文的唯一选择
    是将所有处理包装到flatMap 中,其中Mono.deferContextual()...contextWrite() 如下:

    Mono.just("test")
            .flatMap(s ->
                    Mono.deferContextual(ctx -> {
                        System.out.println("key1=" + ctx.getOrEmpty("key")); // Context in place
                        return Mono.just(s);
                    }).contextWrite(ctx -> ctx.put("key", s)))
            .flatMap(s -> Mono.deferContextual(ctx -> {
                System.out.println("key2=" + ctx.getOrEmpty("key")); // No Context
                return Mono.just(s);
            }));
    

    我希望有人提出更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2011-02-11
      相关资源
      最近更新 更多