java / intermediate
Snippet
Konfigurieren von ThreadPoolTaskExecutor mit benutzerdefinierten Ablehnungsrichtlinien
ThreadPoolTaskExecutor kapselt Javas ThreadPoolExecutor mit Spring-Lifecycle-Management. Die Konfiguration einer begrenzten Warteschlangenkapazität in Kombination mit der CallerRunsPolicy sorgt für Gegendruck (Backpressure), wenn die Thread-Kapazität erschöpft ist: Anstatt Aufgaben zu verwerfen oder eine RejectedExecutionException auszulösen, führt der aufrufende Thread die Aufgabe selbst aus, was die Aufnahmerate natürlich drosselt.
snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Configuration@EnableAsyncpublic class AsyncExecutionConfig {@Bean(name = "eventProcessingExecutor")public Executor eventProcessingExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(4);executor.setMaxPoolSize(16);executor.setQueueCapacity(50);executor.setThreadNamePrefix("EventWorker-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(30);executor.initialize();return executor;}}@Servicepublic class EventPublisher {@Async("eventProcessingExecutor")public CompletableFuture<String> processEventPayload(String eventId) {return CompletableFuture.completedFuture("Processed: " + eventId);}}
spring
Erklärung
1
executor.setQueueCapacity(50);
Legt die Kapazität der internen Warteschlange fest, bevor der Executor weitere Threads bis zur Obergrenze maxPoolSize erzeugt.
2
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
Aktiviert eine Backpressure-Strategie, bei der überfüllte Queues dazu führen, dass der aufrufende Thread die Aufgabe selbst ausführt.
3
executor.setWaitForTasksToCompleteOnShutdown(true);
Stellt sicher, dass laufende Hintergrundaufgaben vollständig beendet werden, bevor der Spring-Container herunterfährt.