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
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 computationThread.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.