2009-03-13 7 views
2

자바 웹 서비스 코드베이스 (BEA/Oracle Weblogic)를 상속 받았으며 웹 서비스에서 외부 백그라운드 애플리케이션을 시작/실행해야합니다.Java Web-Service에서 외부 프로세스를 시작하는 가장 좋은 방법은 무엇입니까?

ProcessBuilder pb = new ProcessBuilder(arg); 
pb.start(); 

뿐만 아니라 :

난 이미 시도했습니다

Runtime.exec(cmdString); 

을하지만 (즉, 시작 응용 프로그램도 과정이지만 작동이 중지 이런 방식으로 응용 프로그램을 시작할 때 이상한 행동을 경험하고 - 정상적인 명령 줄에서 수동으로 실행하면 응용 프로그램이 정상적으로 작동합니다.

외부 프로세스를 시작하는 더 좋은 방법이 있습니까?

편집 : ----------------------

나는이 문제에 도움이 되거 도움이 될 몇 가지 추가 정보가 있습니다.

  • 우리가 이상적인 시나리오되지 않습니다 웹 서비스에 (waitfor() 사용) 완료를 기다리지 완료하는 데 시간이 필요합니다 시작하려고하는 과정.
  • 은 예, 우리는 웹 서비스에서 시작하려고하는 프로세스가 동료 팀 구성원에 의해 만들어졌습니다 [큐 : ... 당신의 눈 롤 지금]
  • 내가 프로세스 빌더를 사용하면 내가 성공 있었다

외부 응용 프로그램이 백그라운드 프로세스로 실행되는 bash 스크립트를 시작하려면 ("&"사용).

#!/bin/bash 
java -jar myApp.jar & 

이것은 분명히 분리 된 프로세스를 생성하지만 적어도 응용 프로그램은 계속 실행됩니다.

답변

2

간단하게 말해서 : 시작된 응용 프로그램이 SDTOUT/STDIN에 기록하고 자주 플러시하지 않는 경우 버퍼가 가득 찼을 때 (프로세스는 차단합니다 (Process.getErrorStream /에는 Process.getInputStream 참조) 정말 작습니다, 4KB 이하).

프로세스를 시작하기 전에 ProcessBuilder.redirectErrorStream()을 호출하는 것이 좋습니다. 그런 다음 run() 메소드가있는 스레드를 다음 줄을 따라 만듭니다.

0

문제가 요청을 끝낸 후에 프로세스를 시작하는 스레드가 TERMINATED 또는 무엇이든 걸릴 것으로 추측하고 있습니다. 항상 살아있는 상태로 유지되는 응용 프로그램에서 하나의 스레드를 사용하면 다른 스레드에서 프로세스를 호출하여 프로세스를 시작하는 데 사용할 수 있습니다.

1

프로세스의 표준 입력과 출력을 올바르게 처리하고 있습니까? 표준 입력 또는 출력이 응용 프로그램에서 처리 중이고 적절하게 처리하지 못하면 실행하는 프로세스가 I/O를 기다리는 동안 중단됩니다.

테스트 방법은 표준 입력, 출력 및 오류를 파일로 리디렉션하여 프로그램을 실행하는 스크립트를 작성하는 것입니다. 그런 다음 웹 서비스 응용 프로그램에서 프로그램 대신 스크립트를 실행하게하십시오. 이 방법으로 프로그램이 완료되면 문제는 프로세스 출력을 처리합니다.

2

우선 Windows 또는 Linux에서이 현상이 발생합니까? 또한, 시작된 응용 프로그램은 어느 정도 수행해야합니까? (이 스크립트는 바이너리입니까? 바이너리입니까?)

편집

좋아, 그럼 회전에 새로운 JVM을 생성합니다 bash 스크립트 (ProcessBuilder 사용) 시작 (java -jar myApp.jar)가 작동합니다.

새 JVM 을 직접으로 생성하려고하면 정확히 ProcessBuilder을 사용하면 어떻게됩니까? 당신은 원래 말했다 :

시작된 응용 프로그램이 시작 응용 프로그램

  1. 작업 중지 당신은 의미합니까 "자바 -jar myApp.jar"중간 bash 스크립트를 통해 하지 직접 호출 할 때 ?
  2. Java를 직접 시작하려고 시도 할 때 다양한 ProcessBuilder 메쏘드에 전달하는 완전하고 완전한 매개 변수 (및 그 값)는 무엇이며이 새로운 JVM이 작동을 멈추게합니까? 실행할 때 당신이 당신의 유닉스 계열의 시스템에서 lsof를 설치하는 경우
  3. (예 : 주석 코드를 제공), 파일 기술자 2와 관련이있는 것으로 표시되어 어떤 파일합니다 (FD 항목을 확인합니다) : lsof -p 1234은 (1234이의 프로세스 ID 어디 "hang"JVM?) 여기서 lsof 명령의 전체 출력을 첨부하는 것이 흥미로울 수 있습니다.
  4. kill -QUIT 1234 (여기서 1234은 "정지"JVM의 프로세스 ID 임)
  5. 명령을 실행 한 후 최대 3 초 후 위의 3 단계에서 식별 한 파일에 추가되는 내용 (파일 설명자 2)
+0

추가 질문에 감사드립니다. 나는 다음과 같은 내용을 포함하도록 나의 질문을 편집했다 : "예, 우리가 웹 서비스에서 시작하려고하는 과정은 동료 팀 구성원에 의해 만들어졌습니다. [큐 : 당신의 눈 롤 ... 지금]" – Nate

+0

또한 동일한 행동이 증명되고 있습니다. Windows와 Linux 모두에서 – Nate

2

"프로세스가 여전히 활성화되어 있어도 작동을 멈 춥니 다."시작한 응용 프로그램의 일부 출력을 기대할 수 있다고 가정합니다.

다음 사용보십시오

ProcessBuilder pb = new ProcessBuilder(arg); 
Process p = pb.start(); 
p.waitFor(); 

WAITFOR()를 필요하다면이 처리 객체가 나타내는 프로세스가 종료 할 때까지 현재의 스레드를 야기한다.

http://java.sun.com/javase/6/docs/api/java/lang/Process.html#waitFor()

+0

제안 해 주신 Martin에 감사드립니다. 불행히도, "waitFor()"를 사용할 수 없습니다. 시작하려고하는 프로세스는 완료하는 데 최대 4 시간이 걸릴 수 있습니다. - 그 이후로 내 주요 질문을 편집했습니다. – Nate

관련 문제