diff --git a/src/main/java/gc/mda/signal_batch/domain/vessel/service/query/CancellableQueryManager.java b/src/main/java/gc/mda/signal_batch/domain/vessel/service/query/CancellableQueryManager.java index 2cceb23..22e9614 100644 --- a/src/main/java/gc/mda/signal_batch/domain/vessel/service/query/CancellableQueryManager.java +++ b/src/main/java/gc/mda/signal_batch/domain/vessel/service/query/CancellableQueryManager.java @@ -20,13 +20,20 @@ public class CancellableQueryManager { // 활성 쿼리 컨텍스트 관리 private final Map activeQueries = new ConcurrentHashMap<>(); - // 쿼리 실행을 위한 스레드 풀 - private final ExecutorService queryExecutor = Executors.newCachedThreadPool(r -> { - Thread thread = new Thread(r); - thread.setName("query-executor-" + thread.getId()); - thread.setDaemon(true); - return thread; - }); + // 쿼리 실행을 위한 스레드 풀 (상한 제한) + private final ExecutorService queryExecutor = new ThreadPoolExecutor( + 5, // corePoolSize + 20, // maximumPoolSize (무제한 방지) + 60L, TimeUnit.SECONDS, // keepAliveTime + new LinkedBlockingQueue<>(100), // 대기 큐 크기 제한 + r -> { + Thread thread = new Thread(r); + thread.setName("query-executor-" + thread.getId()); + thread.setDaemon(true); + return thread; + }, + new ThreadPoolExecutor.CallerRunsPolicy() // 큐 포화 시 호출 스레드에서 실행 + ); /** * 취소 가능한 쿼리 실행