[英]Some questions about running ProcessBuilder through a webapp
我正在編寫一個webapp,它基本上允許用戶使用通過各種表單輸入的參數啟動shell腳本。 在做了一些研究后,我相信ProcessBuilder是運行shell腳本的最佳方式,但是我有一些條件需要我滿足並且希望其他人可以告訴我,如果我正在考慮正確的行。
將要啟動的腳本可能需要幾個小時才能運行。 所以顯然我不能讓應用暫停並等待那么長時間。 所以我想知道線程是否是該問題的答案? 我對使用線程和尋找一些建議不是很有經驗。 我應該在新線程中啟動ProcessBuilder,以便主Web應用程序繼續運行嗎? 這甚至會起作用嗎? 它只是簡單地聲明一個新線程並為其分配流程構建器嗎? 我是否需要擔心運行或創建各種線程? 只是不確定要注意什么或要注意哪些陷阱。
另外,我確實需要一種方法,至少能夠在運行過程后檢查其狀態。 需求需要某種方式來顯示過程的進展,但是我不知道那是可能的。 我認為至少能夠表明它仍在運行應該是可以接受的。 我將如何進行檢測?
有關更多信息,它是一個Java / Spring Web應用程序,將在某些Unix上運行。 感謝您的任何想法和幫助。
您可以實現JobManager
和Job
類的東西。
Job
可以是具有ProcessBuilder
的Runnable
。 在它的run
方法中,它啟動進程( ProcessBuilder.start
),等待它退出並在完成時回調JobManager
,可能返回進程的退出狀態。
JobManager
創建Jobs
(每個都在新的Thread
),維護當前作業的集合(也許是最近完成的作業的集合,可能是失敗的作業的列表)。 客戶端可以給JobManager作業執行並查詢所有作業或特定作業的狀態(運行,完成,失敗)。
關於進程的狀態,作業可以具有startTime,endTime和exitStatus變量以及關聯的get方法。 您可以將這些返回給客戶端以顯示作業狀態表。
您的Job.run
方法可能看起來像這樣。
public void run() {
startTime = System.currentTimeMillis();
process = processBuilder.start();
// spawn threads to consume process output streams
// even if you're not going to read them
while (running) {
try {
process.waitFor();
running = false;
} catch (InterruptedException e) {
// you could stop a process by interrupting it's Job thread
process.destroy();
}
}
exitStatus = process.exitValue();
endTime = System.currentTimeMillis();
jobManager.onExit(this);
}
關於“完成百分比”,如果您有某種方法可以測量它,那將是唯一可行的。
如果任務應在一定時間內完成,則可以將其用作報告預期完成時間/完成百分比的粗略方法。
或者,也許您可以捕獲流程的輸出,使用該輸出在Job中設置一個percentComplete變量。 例如,當您在輸出中看到“消息X”時,請設置percentComplete = 25%。 這將意味着為每種類型的腳本實現自定義代碼-可能是Job的子類,或者為Job分配一個負責解析輸出的成員變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.