如何从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内部正确地进行操作。
答案 0 :(得分:2)
EJB的一个要点就是您不必担心并发性,保证在任何给定时间只有一个线程会调用您的EJB方法。 ProcessBuilder不必是线程安全的,只要你不使它成为静态的,也不要在EJB的不同实例之间共享相同的实例。