java / intermediate
Snippet
Widerstandsfähige Fallbacks für reaktive HTTP-Aufrufe mit WebClient und onErrorResume
Bei der Entwicklung reaktiver Microservices mit Spring WebFlux können Netzwerkaufrufe durch Timeouts oder entfernte HTTP-Fehlercodes fehlschlagen. Der Operator `onErrorResume` fängt gezielte Ausnahmen im reaktiven Datenstrom ab und leitet nachgelagerte Konsumenten auf ein Fallback-`Mono` um, ohne die gesamte Subscriber-Pipeline zum Absturz zu bringen oder unbehandelte Fehler zu werfen.
snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Mono<UserProfile> fetchUserProfileWithFallback(String userId) {return webClient.get().uri("/api/users/{id}", userId).retrieve().bodyToMono(UserProfile.class).timeout(Duration.ofMillis(1500)).onErrorResume(WebClientResponseException.NotFound.class, ex -> {log.warn("Remote profile not found for user: {}", userId);return Mono.just(UserProfile.anonymousDefault());}).onErrorResume(TimeoutException.class, ex -> {log.error("User service timed out, returning cached profile", ex);return cacheService.getCachedProfile(userId);});}
spring
Erklärung
1
.timeout(Duration.ofMillis(1500))
Löst eine TimeoutException aus, wenn der entfernte Dienst nicht innerhalb von 1,5 Sekunden antwortet.
2
.onErrorResume(WebClientResponseException.NotFound.class, ex -> {
Fängt gezielt HTTP-404-Fehler ab und definiert eine Funktion zur Bereitstellung eines Ausweich-Publishers.
3
return Mono.just(UserProfile.anonymousDefault());
Liefert einen sicheren Standardwert in einem Mono zurück, anstatt den Fehler weiterzuleiten.
4
.onErrorResume(TimeoutException.class, ex -> {
Behandelt Zeitüberschreitungen separat, indem versucht wird, Daten aus einem lokalen Cache zu laden.