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

在TimeoutMain Subcriber的情况下,将Reator上下文复制到MDC

和魁
2023-03-14

我一直在遵循代码在https://github.com/archie-swif/webflux-mdc/blob/master/src/main/java/com/example/webfluxmdc/MdcContextLifter.java把数据从Reactor上下文到MDC使用钩子。

除了Mono超时和TimeoutMainSubscriber正在使用之外,该解决方案在大多数情况下都能完美工作。

下面是我使用的小测试。

Mono<Integer> integerMono = Mono.just(1)
            .doOnEach(logger.addToContext(i -> ImmutableMap.of("index", i)))
            .flatMap(___ -> Mono.fromSupplier(() -> {
                try {
                    Thread.sleep(6000);
                } catch (InterruptedException e) {
                    return 0;
                }
                return 1;
            }))
            .timeout(Duration.ofMillis(5000), Schedulers.parallel())
            .doOnEach(logger.info("testMDCLogging"))
            .doOnError(logger.error("testMDCErrorLogging"))
            .subscriberContext(logger.initContext());

在通过MDC提升程序验证上下文的传播时,onNext()onError()onComplete()TimeoutMainSubscriber(上下文复制到MDC)中不调用,只调用currentContext()

如何传播上下文并复制到MDC,以便在Mono超时的情况下在doOnErrordoOneach中使用?我不想将副本移动到当前上下文(),因为这个方法被调用了几次,在我看来它不是最佳解决方案。

共有1个答案

伍耀
2023-03-14

您是否尝试在MdcContextLifter类中重写onError方法?

    @Override
    public void onError(Throwable t) {
        copyToMdc(coreSubscriber.currentContext()); // similar to onNext()
        coreSubscriber.onError(t);
    }
 类似资料:
  • 问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con

  • 问题内容: 我有一个Flask应用程序,当从flask调用它时,调用时不会出现问题。 我需要相同的方法在flask外部工作 我可以使用,但是我想在两种情况下(flask and command line)都可以使用相同的方法 问题答案: 你需要在应用程序上下文中呈现它。将应用程序导入后端代码,然后执行以下操作。

  • 我正在尝试将Cucumber集成到现有的Spring Boot项目中 当前项目是单个Maven模块 单元测试(不含Spring上下文)和集成测试(含Spring上下文)组合在同一个测试文件夹中。 我想做的是能够调整我的单元测试和集成测试。 但是一旦我添加了依赖项(为了能够在规范旁边运行Spring上下文),它就要求文件夹中的所有测试都用注释。 下面是我的测试套件,配置为获取测试规范。 是否可以将两

  • 我是第一次使用代码优先的方法。如果我错过了一些非常基本的东西,请原谅我。 我需要传递连接字符串到DB上下文,但我不能将连接字符串app.config,因为我在类本身调用一个金块,它给我连接字符串。 这种做法正确吗?我无法在本地系统上测试此功能。还是我应该把绳子传给基地 类A():基(连接)

  • 在我开始之前,我已经阅读了和同一个问题相关的帖子。但是,该帖子中的SDK版本很旧。根据AWS nugetpage,新版本3可用,每个服务都有单独的软件包。 用于.NET的AWS SDK的新版本3对每个服务使用单独的包。例如,AmazonS3在AWSSDK.S3包中,AmazonSQS在AWSSDK.SQS中,AmazonDynamoDB在AWSSDK.DynamoDBv2中。 所以我已经安装了包n