-1

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를 어떻게 내부에서 제대로 수행하는지 알고 싶습니다.

답변

2

EJB의 요점 중 하나는 동시성에 대해 걱정할 필요가 없다는 것입니다. 한 번에 하나의 스레드 만 EJB 메소드를 호출 할 것이라는 보장이 있습니다. ProcessBuilder는 정적으로 만들거나 EJB의 다른 인스턴스간에 동일한 인스턴스를 공유하지 않는 한 스레드로부터 안전 할 필요는 없습니다.

+0

답변 해 주셔서 감사합니다. 글쎄, 나는 당신과 동의한다, 그것은 EJB 아이디어이다. 그러나이 코드를 여러 MDB에서 실행 한 후에는 재현 할 수없는 이상한 오류가 발생하므로 첫 번째 용의자는 Runtime.exec입니다. 내가 Stateless EJB 내부에서 ProcessBuilder를 호출한다면 thread-safe이면 충분하다고 생각합니까? – Leo

+0

실제로'Runtime.exec'도 작업을 수행해야합니다. 오류가 발생하면 게시 할 수 있습니까? – Camilo

+0

그게 문제입니다. 예외는 발생하지 않습니다. 하지만 JMS 대기열에서 소비하는 10 개의 MDB가 시작될 때마다 런타임 엔진이 결과를 엉망으로 만듭니다. 문제를 여기에 게시하도록 격리하겠습니다. 감사 – Leo