-1
如何從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;
}
}
請不要靠近或downvote這個問題。
我知道這不是線程安全的。我只想知道如何從EJB內部正確執行。
感謝您的回答。那麼,我同意你的看法,那就是EJB理念。但是,在多個MDB中運行此代碼後,我收到了一些我無法再現的奇怪錯誤,所以我的第一個疑問是Runtime.exec。你認爲如果我從無狀態EJB內部調用一個ProcessBuilder,它足夠線程安全嗎? – Leo
實際上'Runtime.exec'也應該完成這項工作,你可以發佈你得到的錯誤嗎? – Camilo
這就是問題所在。沒有例外被拋出。但是當從一個JMS隊列中消耗10個MDB時,每個MDB都是一個runtime.exec,不知何故,它會混淆結果。讓我試着將問題隔離在這裏發佈。謝謝 – Leo