Потокобезопасный способ вызова внешнего процесса (и получения его выходного потока) из EJB
Как я могу вызвать внешний процесс потокобезопасным способом из 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 ответ
Одним из моментов EJB является именно то, что вам не нужно беспокоиться о параллелизме, вам гарантировано, что только один поток будет вызывать ваш EJB-метод в любой момент времени. ProcessBuilder не должен быть потокобезопасным, если вы не делаете его статичным и не делите один и тот же экземпляр между различными экземплярами ваших EJB.