如何在 Project Reactor 中捕获异常?

问题描述 投票:0回答:1

https://httpbin.org/status/404
返回 404 错误。总是。我如何捕获它以及为什么我的尝试失败了?

这是代码。我实际上将代码片段包装在 Junit 测试中(如下所示:

@Test{/*snippet*/}
)。我在下面的代码中省略了它

只有当您

block()

时,您才能发现请求根本有问题
        WebClient.builder().build()
                .get()
                .uri("https://httpbin.org/status/404")
                .retrieve()
                .bodyToMono(String.class)
                .block();
org.springframework.web.reactive.function.client.WebClientResponseException$NotFound: 404 Not Found from GET https://httpbin.org/status/404

但是,如果我只是订阅并尝试捕获它,则什么也不会发生。这是我尝试过的:

尝试1。通过
Throwable
Consumer

        WebClient.builder().build()
                .get()
                .uri("https://httpbin.org/status/404")
                .retrieve()
                .bodyToMono(String.class)
                .subscribe(
                        s -> System.out.println("Success: " + s),
                        t -> System.out.println("Failure: " + t.getMessage()));

尝试 2。调用
onErrorReturn()
并进行后备

        WebClient.builder().build()
                .get()
                .uri("https://httpbin.org/status/404")
                .retrieve()
                .bodyToMono(String.class)
                .onErrorReturn("Fallback")
                .subscribe(
                        s -> System.out.println("Success: " + s),
                        t -> System.out.println("Failure: " + t.getMessage()));

尝试 3。调用
onErrorResume()
并从回调中返回空
Mono

        WebClient.builder().build()
                .get()
                .uri("https://httpbin.org/status/404")
                .retrieve()
                .bodyToMono(String.class)
                .onErrorResume(t -> {
                    log.warn("Could not access the resource: " + t.getMessage());
                    return Mono.empty();
                })
                .subscribe(
                        s -> System.out.println("Success: " + s),
                        t -> System.out.println("Failure: " + t.getMessage())
                );

没有异常,没有任何类型的日志(就好像没有成功,也没有失败)

我真诚地尝试阅读本参考指南,但不幸的是我发现它不是很有帮助。在我看来,它有两个极端:太简单(

Flux.just(1,2,3)
)和太复杂(或者至少解释得不太好)

java project-reactor
1个回答
0
投票

无论如何,如果您有答案,请分享您的答案,我很乐意收到您的意见

哦,我明白了。它们在某个守护线程中执行代码,以便 JVM 在我的错误处理开始之前退出。这是有效的:

        WebClient.builder().build()
                .get()
                .uri("https://httpbin.org/status/404")
                .retrieve()
                .bodyToMono(String.class)
                .subscribe(
                        s -> System.out.println("Success: " + s),
                        t -> System.out.println("Failure: " + t.getMessage())
                );
        Thread.sleep(5000);
Failure: 404 Not Found from GET https://httpbin.org/status/404

该设计决策背后的原因是什么?我应该如何知道它?当我读到这篇文章时,我从未想到他们会奉献一些守护进程

获得 Flux 或 Mono 并不一定意味着它运行在专用线程中。相反,大多数运算符继续在前一个运算符执行的线程中工作。除非指定,否则最顶层的运算符(源)本身在调用 subscribe() 的线程上运行。

subscribe()
不是在主线程中调用的吗?

© www.soinside.com 2019 - 2024. All rights reserved.