Потокобезопасный способ вызова внешнего процесса (и получения его выходного потока) из 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.

Другие вопросы по тегам