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
但是,如果我只是订阅并尝试捕获它,则什么也不会发生。这是我尝试过的:
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()));
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()));
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)
)和太复杂(或者至少解释得不太好)
无论如何,如果您有答案,请分享您的答案,我很乐意收到您的意见
哦,我明白了。它们在某个守护线程中执行代码,以便 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()
不是在主线程中调用的吗?