0

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

如 javadoc 中所述,ProcessBuilder 不是线程安全的。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 内部正确地做到这一点。

4

1 回答 1

2

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

于 2014-02-13T04:02:54.410 回答