EJB 내부에서 스레드로부터 안전한 방법으로 외부 프로세스를 호출하려면 어떻게해야합니까?EJB 내부에서 외부 프로세스를 호출하고 (출력 스트림을 잡는) 스레드로부터 안전한 방법
javadoc에서 설명한 것처럼 ProcessBuilder는 스레드로부터 안전하지 않습니다. 아파치 commons exec는 thread-safety에 대해 아무것도 말하지 않고 Runtime.exec에도 확신이 없습니다.
적절한 방법은 무엇입니까?
는public int startTask(Logger logger, String expectPath, String expectScriptPath, long ticket) throws IOException {
Runtime r = Runtime.getRuntime();
Process p = r.exec(expectPath+" "+expectScriptPath+" "+ticket);
SessionLogger sysout = new SessionLogger(logger,p.getInputStream());
sysout.start();
SessionLogger syserr = new SessionLogger(logger,p.getErrorStream());
syserr.start();
try {
return p.waitFor();
} catch (InterruptedException e) {
log.error(e.getMessage(),e);
return -1;
}
}
가까이하지 마십시오하지 때때로,이 코드는 때때로 작동, 사람들이 내가 학대라고 생각하지 않도록 내가 몇 가지 코드를 추가 할 수 있도록하거나 질문을 downvote.
스레드 안전하지 않다는 것을 알고 있습니다. EJB를 어떻게 내부에서 제대로 수행하는지 알고 싶습니다.
답변 해 주셔서 감사합니다. 글쎄, 나는 당신과 동의한다, 그것은 EJB 아이디어이다. 그러나이 코드를 여러 MDB에서 실행 한 후에는 재현 할 수없는 이상한 오류가 발생하므로 첫 번째 용의자는 Runtime.exec입니다. 내가 Stateless EJB 내부에서 ProcessBuilder를 호출한다면 thread-safe이면 충분하다고 생각합니까? – Leo
실제로'Runtime.exec'도 작업을 수행해야합니다. 오류가 발생하면 게시 할 수 있습니까? – Camilo
그게 문제입니다. 예외는 발생하지 않습니다. 하지만 JMS 대기열에서 소비하는 10 개의 MDB가 시작될 때마다 런타임 엔진이 결과를 엉망으로 만듭니다. 문제를 여기에 게시하도록 격리하겠습니다. 감사 – Leo