diff --git a/backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java b/backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java index 9a7caa80..bafddbfc 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java @@ -37,4 +37,19 @@ public class AsyncConfig { executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); return executor; } + + @Bean("thumbnailExecutor") + public Executor thumbnailExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(1); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(200); + executor.setThreadNamePrefix("Thumbnail-"); + // CallerRunsPolicy applies back-pressure to quick-upload batches and admin backfill + // instead of dropping work (shared taskExecutor uses AbortPolicy). Safe because the + // task is dispatched via TransactionSynchronization.afterCommit, which runs on a + // post-commit callback thread without active transaction synchronization. + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } } \ No newline at end of file