log.error("Java로 Command 사용시 process hang 현상으로 인한 무한대기")

in_ho_·2022년 11월 3일
0

log.error()

목록 보기
2/2
post-thumbnail

현상

  • Java를 이용해 Python을 호출한 후 파라미터를 넘겨 특정 로직을 실행시키던 중 프로세스의 종료를 기다리는
int execVal = process.waitFor();

에서 무한 대기하는 현상

환경

Back : Spring Framework
Front : RestAPI를 수신하는 SPA 방식
Computer : Window
WAS : Jetty

코드

bReader = new BufferedReader(new java.io.InputStreamReader(process.getInputStream(), "utf-8"));
int exitVal = process.waitFor(); // 프로세스가 종료될 때까지 대기     
while ((line = bReader.readLine()) != null) {
	log.info(line);
}

과정

  • process.waitFor()에서 정지한다는 것은 프로세스가 정상적으로 실행이 되지 않았거나, 의도치 않을 때 먼저 종료된 경우 일 것으로 특정할 수 있다.

  • BufferedReader가 프로세스가 종료되어 출력 스트림을 읽지 못하면 교착상태에 빠질 수 있습니다.

  • 만약 프로세스의 종료까지 대기하는 process.waitFor()의 위치를 스트림 이후로 옮긴다면 Log를 받을 수 있지 않을까 싶어 아래와 같이 코드를 수정했습니다.

bReader = new BufferedReader(new java.io.InputStreamReader(process.getInputStream(), "utf-8"));
   
while ((line = bReader.readLine()) != null) {
	log.info(line);
}

int exitVal = process.waitFor(); // 프로세스가 종료될 때까지 대기  

process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
  • 추가된 부분은 process의 스트림을 close하게 되면 hang 현상이 발생하는 것을 미연에 방지할 수 있다고 한다. 물론 close()가 해당 현상을 해결해 주지는 못했다.

Reference

https://stackoverflow.com/questions/5483830/process-waitfor-never-returns

0개의 댓글