0 Tage Serie
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
@EnableAsync
public 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;
}
}
@Service
public 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.