반응형
was컨테이너를 1주에 한 번은 재기동을 하는 일이 생겼다. 10일 이후부터 instance가 1개의 컨테이너에 줄을 서서 쌓이는 현상이 생긴 것이다. 이 해결을 위해 살펴보던 도중 jennifer에서 Current ThreadPool 항목이 있었는데 그게 한 컨테이너당 30,000개가 넘었다. 이 문제의 해결 방법은 ThreadPool사용하는 곳을 사용 후 반환하도록 하는 것이었다.
찾아보니 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을 종료해 버리는 문제를 해결하기 위해 사용한다.
'프로그래밍팁' 카테고리의 다른 글
powershell 하위경로의 파일 리스트 가져오기 (0) | 2022.10.13 |
---|---|
[javascript 입력한 내용 클렙보드에 복사] (0) | 2021.01.27 |