0 Tage Serie
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.