从EJB内部调用外部进程(并获取其输出流)的线程安全方法

时间:2014-02-13 03:51:18

标签: java multithreading runtime.exec processbuilder apache-commons-exec

如何从EJB内部以线程安全的方式调用外部进程?

ProcessBuilder不是线程安全的,如javadoc中所述。 Apache commons exec对线程安全没有任何说明,我对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;
    }

}

请不要关闭或关闭此问题。

我知道这不是线程安全的。我只想知道如何从EJB内部正确地进行操作。

1 个答案:

答案 0 :(得分:2)

EJB的一个要点就是您不必担心并发性,保证在任何给定时间只有一个线程会调用您的EJB方法。 ProcessBuilder不必是线程安全的,只要你不使它成为静态的,也不要在EJB的不同实例之间共享相同的实例。