Как я могу вызвать внешний процесс в потоковом безопасном режиме изнутри EJB?Thread-safe способ вызова внешнего процесса (и захвата его выходного потока) изнутри 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;
}
}
пожалуйста, не близко или downvote этот вопрос.
Я знаю, что это не безопасный поток. Я просто хочу знать, как это сделать изнутри EJB.
спасибо за ответ. Хорошо, я согласен с вами, это идея EJB. Но после запуска этого кода в нескольких MDB, я получаю некоторые странные ошибки, которые я не могу воспроизвести, поэтому мой первый подозреваемый - Runtime.exec. Как вы думаете, если я вызову ProcessBuilder вместо этого изнутри EJB без состояния, этого было бы достаточно, чтобы быть потокобезопасным? – Leo
на самом деле 'Runtime.exec' должен делать работу так же хорошо, можете ли вы опубликовать ошибку, которую вы получаете? – Camilo
вот в чем проблема. исключение не выбрасывается. но когда 10 MDBs, потребляющих из очереди JMS, запускаются, каждый из них, runtime.exec, как-то он возится с результатами. Позвольте мне попытаться изолировать проблему, чтобы опубликовать здесь. благодаря – Leo