-1

Как я могу вызвать внешний процесс в потоковом безопасном режиме изнутри 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.

ответ

2

Одним из пунктов EJB является то, что вам не нужно беспокоиться о параллелизме, вы гарантированно, что только один поток будет ссылаться на ваш метод EJB в любой момент времени. ProcessBuilder не должен быть потокобезопасным, если вы не статируете его и не разделяете один и тот же экземпляр между разными экземплярами ваших EJB.

+0

спасибо за ответ. Хорошо, я согласен с вами, это идея EJB. Но после запуска этого кода в нескольких MDB, я получаю некоторые странные ошибки, которые я не могу воспроизвести, поэтому мой первый подозреваемый - Runtime.exec. Как вы думаете, если я вызову ProcessBuilder вместо этого изнутри EJB без состояния, этого было бы достаточно, чтобы быть потокобезопасным? – Leo

+0

на самом деле 'Runtime.exec' должен делать работу так же хорошо, можете ли вы опубликовать ошибку, которую вы получаете? – Camilo

+0

вот в чем проблема. исключение не выбрасывается. но когда 10 MDBs, потребляющих из очереди JMS, запускаются, каждый из них, runtime.exec, как-то он возится с результатами. Позвольте мне попытаться изолировать проблему, чтобы опубликовать здесь. благодаря – Leo

Смежные вопросы