簡體   English   中英

關於通過webapp運行ProcessBuilder的一些問題

[英]Some questions about running ProcessBuilder through a webapp

我正在編寫一個webapp,它基本上允許用戶使用通過各種表單輸入的參數啟動shell腳本。 在做了一些研究后,我相信ProcessBuilder是運行shell腳本的最佳方式,但是我有一些條件需要我滿足並且希望其他人可以告訴我,如果我正在考慮正確的行。

將要啟動的腳本可能需要幾個小時才能運行。 所以顯然我不能讓應用暫停並等待那么長時間。 所以我想知道線程是否是該問題的答案? 我對使用線程和尋找一些建議不是很有經驗。 我應該在新線程中啟動ProcessBuilder,以便主Web應用程序繼續運行嗎? 這甚至會起作用嗎? 它只是簡單地聲明一個新線程並為其分配流程構建器嗎? 我是否需要擔心運行或創建各種線程? 只是不確定要注意什么或要注意哪些陷阱。

另外,我確實需要一種方法,至少能夠在運行過程后檢查其狀態。 需求需要某種方式來顯示過程的進展,但是我不知道那是可能的。 我認為至少能夠表明它仍在運行應該是可以接受的。 我將如何進行檢測?

有關更多信息,它是一個Java / Spring Web應用程序,將在某些Unix上運行。 感謝您的任何想法和幫助。

您可以實現JobManagerJob類的東西。

Job可以是具有ProcessBuilderRunnable 在它的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM