0 Tage Serie
java / expert
Snippet

Nicht-blockierende asynchrone Verarbeitung mit DeferredResult

DeferredResult wird verwendet, um den Web-Container-Thread freizugeben, während lang laufende Aufgaben in einem separaten Thread verarbeitet werden. Dies verbessert die Skalierbarkeit und den Durchsatz der Anwendung unter hoher Last erheblich.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@GetMapping("/async-task")
public DeferredResult<ResponseEntity<?>> executeAsyncTask() {
DeferredResult<ResponseEntity<?>> output = new DeferredResult<>(5000L);
ForkJoinPool.commonPool().submit(() -> {
try {
// Simulate heavy computation
Thread.sleep(2000);
output.setResult(ResponseEntity.ok("Task Completed"));
} catch (Exception e) {
output.setErrorResult(ResponseEntity.status(500).body("Error"));
}
});
return output;
}
spring
Erklärung
1
DeferredResult<ResponseEntity<?>> output = new DeferredResult<>(5000L);
Initialisiert ein DeferredResult mit einem Timeout von 5 Sekunden.
2
output.setResult(ResponseEntity.ok("Task Completed"));
Setzt das Endergebnis der Operation, was die HTTP-Antwort abschließt.
3
return output;
Gibt den Container-Thread sofort an den Pool zurück, während der Worker-Thread die Verarbeitung fortsetzt.