-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內部正確執行。

回答

2

EJB的一個要點正是您不必擔心併發性,您可以保證在任何給定的時間只有一個線程將調用您的EJB方法。 ProcessBuilder不必是線程安全的,只要你不使它成爲靜態的,也不能在你的EJB的不同實例之間共享同一個實例。

+0

感謝您的回答。那麼,我同意你的看法,那就是EJB理念。但是,在多個MDB中運行此代碼後,我收到了一些我無法再現的奇怪錯誤,所以我的第一個疑問是Runtime.exec。你認爲如果我從無狀態EJB內部調用一個ProcessBuilder,它足夠線程安全嗎? – Leo

+0

實際上'Runtime.exec'也應該完成這項工作,你可以發佈你得到的錯誤嗎? – Camilo

+0

這就是問題所在。沒有例外被拋出。但是當從一個JMS隊列中消耗10個MDB時,每個MDB都是一個runtime.exec,不知何故,它會混淆結果。讓我試着將問題隔離在這裏發佈。謝謝 – Leo

相關問題