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

获取返回mono.empty()的mono/flux的行号

松刚豪
2023-03-14
        Mono.just("data")
                .flatMap(t -> {
                    if (System.currentTimeMillis() % 2 == 0) {
                        return Mono.empty();
                    }
                    return Mono.just("happy1");
                })
                .flatMap(t -> {
                    if (System.currentTimeMillis() % 2 == 0) {
                        return Mono.empty();
                    }
                    return Mono.just("happy2");
                })
                .map(s -> {
                    return "successful complete: " + s;
                })
        .switchIfEmpty(Mono.fromCallable(() -> {
            return "how did I get here?";
        }))
        .block();

共有1个答案

暴乐邦
2023-03-14

由于fluxmono的动态性,以及oncomplete信号被认为足够中性,因此通常只是通过,因此没有通用的解决方案。

在您的特定示例中,可以将mono.empty()替换为mono.empty().dooncomplete(()->/*log something*/)。您甚至可以直接在if块中执行日志记录,但是修饰的空技巧可能适用于更多的情况。

另一种可能是将空变为错误,而不是打开onComplete信号。错误不那么中立,因此有方法来丰富它们以用于调试目的。例如,在每个flatMap后面有一个.checkpoint(“FlatMapX”)语句,您将获得额外的stacktrace部分,这些部分将指向由于空而失败的flatMap。

static final String PARSEABLE_MARKER = "PARSEABLE MARKER: <";
static final char MARKER_END = '>';

String parseLocation(Exception e) {
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);

    String trace = sw.toString();
    int start = trace.indexOf(PARSEABLE_MARKER);
    if (start > 0) {
        trace = trace.substring(start + PARSEABLE_MARKER.length());
        trace = trace.substring(0, trace.indexOf(MARKER_END));
        return trace;
    }
    return "I don't know";
}

String testInner() {
    Random random = new Random();
    final boolean first = random.nextBoolean();

    return Mono.just("data")
            .flatMap(t -> {
                if (System.currentTimeMillis() % 2 == 0 && first) {
                    return Mono.empty();
                }
                return Mono.just("happy1");
            })
            .single()
            .checkpoint(PARSEABLE_MARKER + "the first flatMap" + MARKER_END)
            .flatMap(t -> {
                if (System.currentTimeMillis() % 2 == 0 && !first) {
                    return Mono.empty();
                }
                return Mono.just("happy2");
            })
            .single()
            .checkpoint(PARSEABLE_MARKER + "the second flatMap" + MARKER_END)
            .map(s -> {
                return "successful complete: " + s;
            })
            .onErrorResume(NoSuchElementException.class, e ->
                    Mono.just("how did I get here? " + parseLocation(e)))
            .block();
}
    @Test
void test() {
    int successCount = 0;
    int firstCount = 0;
    int secondCount = 0;
    for (int i = 0; i < 100; i++) {
        String message = testInner();
        if (message.startsWith("how")) {
            if (message.contains("first")) {
                firstCount++;
            }
            else if (message.contains("second")) {
                secondCount++;
            }
            else {
                System.out.println(message);
            }
        }
        else {
            successCount++;
        }
    }
    System.out.printf("Stats: %d successful, %d detected first, %d detected second", successCount, firstCount, secondCount);
}
Stats: 85 successful, 5 detected first, 10 detected second
 类似资料:
  • 下一个metod在TokenService类中。

  • 我正在我的项目中使用spring webflux。我的controller类调用返回Mono或Flux的服务类方法。 我正在尝试为我的服务类编写单元测试。我不确定如何为返回mono/flux的方法编写单元测试。我查看的大多数文章都建议我使用WebClientTest。但重点是,我在这里测试我的服务类。当我通过模拟服务类方法测试我的web层(控制器类)时,我使用了WebclientTest。 对如何

  • 我想在上一次返回

  • 问题内容: 是否可以获取从调用范围返回函数的行号? 例: 我认为这是不可能的,因为它应该已经从堆栈中删除了,但是也许它仍然被缓存在某个地方? 用例是我有一个HTTP处理程序,我想记录返回错误的行和文件名,而不必乱扔代码。 问题答案: AFAIK,不可能自动获取执行最后一次返回的行。 但是,有了一个小帮手,您可以拥有: 操场 输出:

  • 如何正确处理由期货构建的Monos? 我试着让我的头脑围绕着Spring Reactive(和Spring 5),观看所有的视频,阅读所有我能找到的博客,但他们似乎都没有做一些事情,而不仅仅是查询数据库或其他琐碎的事情。 我正在使用新的AWS 2.0开发工具包,它使用的用于大多数事情。使用服务创建新实例,我的方法如下所示 我在这里的理解是,我几乎立即返回类型的,而将随时执行它的操作。 我从我的路由

  • 假设我有以下流程 只是为了理解 因此,我有 但我需要 继续皱眉 这个问题有什么好的解决办法吗?