본문 바로가기

프로그래밍팁

java executor completablefuture thread pool close

반응형

was컨테이너를 1주에 한 번은 재기동을 하는 일이 생겼다. 10일 이후부터 instance가 1개의 컨테이너에 줄을 서서 쌓이는 현상이 생긴 것이다. 이 해결을 위해 살펴보던 도중 jennifer에서 Current ThreadPool 항목이 있었는데 그게 한 컨테이너당 30,000개가 넘었다. 이 문제의 해결 방법은 ThreadPool사용하는 곳을 사용 후 반환하도록 하는 것이었다.

 

jennifer의 액티브서비스

 

찾아보니 Executor를 사용하지 말고 ExecutorService를 사용해 executor.shutdown() 을 사용해서 사용 후 남아있는 빈 컨테이너가 남지 않도록 종료하는 것이었다.

 

맨 끝에 executor.shitdown(); 만 추가하고 10일정도 지났다. 

 

jennifer에서 Current ThreadPool 항목에 ThreadPool은 줄어들었다. 

 

아래는 코드의 일부를 넣었다.

public <T> CompletableFuture<T> getAsync(Call<T> call, CompletableFuture<T> completableeFuture) throws Exception {

    // Executor excutor = Executors.newFixedThreadPool(10);

    ExecutorService excutor = Executors.newFixedThreadPool(10);



    completableFuture (CompletableFuture<T>) CompletableFuture.supplyAsync()) -> {

        Response response = null;
        ResponseVO<T> responseVO = new ResponseVO<T>();
    
        try {
            response = call.execute();
        
            if (response.isSuccessful()) {
                responseVO = (ResponseVO<T>) onSuccess(response);
            } else {
                responseVO = (ResponseVO<T>) onFailure(response);
            }
        } catch (Exception e) {
            logger.error("Execute Exception:::");
        }
    
        return responsrVO;
    }, executor).exceptionally(e -> {
        logger.error("Execute global Exception:::{}", e);
        return null;
    });

    executor.shutdown();
    return completableFuture;
}

 

 

threadpool을 하나만 사용하는데는 잘 사용되지만 혹시 여러 개를 호출하는 경우는 아래 구문으로 바꾸어야 한다.

 

.thenRun(() -> {executor.shundown(); }); 

 

이 부분은 Threadpool을 여러 개 사용할 때 첫 번째 것을 사용 후 Threadpool을 종료해 버리는 문제를 해결하기 위해 사용한다.