2013-03-06 55 views
1

我需要從java進程調用外部進程/腳本/ cli命令。
由於這些電話將是相當多的,有的將返回過程/腳本,運行和其他人將只運行它的結果,我在想,如果:進行外部進程調用時的設計優化

  1. 有一個標準設計圍繞打造Java的ProcessBuilder 這樣我就沒有分散的代碼調用ProcessBuilder 不斷
  2. 我可以做什麼優化?例如,從文件中讀取所有cli命令而不是保留它們例如 是有意義的。作爲 final String的代碼?
+0

請發佈一些命令示例 – Aubin 2013-03-06 21:05:56

+0

@Aubin:例子是:通過'/etc/init.d',do'ifconfig'重啓其他進程,做遠程shell命名最重要的 – Cratylus 2013-03-06 21:17:04

回答

2

你的問題是模糊寫一個確切的答案一點點,但我有一些建議:

  • 殼設計鏈接命令(管道,等等,等等),和一點點的代碼一點邏輯。殼被解釋並且非常容易更新,但必須保持簡單。它們可能是您系統的基本組成部分。
  • 編寫自己的launch方法來啓動一個進程並捕獲stdout和stderr(在兩個線程中)來寫驅動程序的日誌。
  • 設計一個XML文件,以聲明方式:
    • 進程的路徑,他們的論據(靜態的)
    • 並行和就業
  • 之間的同步Java編寫的模型,以反映XML過程模型(JAXB可能是一個解決方案)
  • 添加到模型中等待一組作業的能力
  • 將修飾符添加到模型以動態更改參數的值

如果我嘗試分類你的問題,我認爲主要在控制流程

要解決一個很大的問題,你可以使用並行:同時啓動多個進程,等待它們全部終止:這是一個相約加入階段。也許你可以啓動遠程命令到另一臺聯網的計算機。

一個很好的例子,如何指定並行成一個XML文件是ANT build files

<parallel> 
    <wlrun ... > 
    <sequential> 
    <sleep seconds="30"/> 
    <junit fork="true" forkmode="once" ... > 
    <wlstop/> 
    </sequential> 
</parallel> 

我可以建議你使用ANT無需編程來解決問題了嗎?

希望執行的繪圖可能幫助,用紙和筆... ;-)

幾個圖形應用程序可以幫助繪製控制流的邏輯圖。完成後,在這裏發佈,你會得到更準確的答案,我希望...

+0

+ 1.這很有趣,但是有些部分我不遵循。當你提到作業時,你是什麼意思?'model'是什麼意思?我的意思是你只是建議從XML配置文件讀取(甚至可能是一個屬性文件)是正確的? – Cratylus 2013-03-06 21:28:53

+0

謝謝。是的,作業是{Process +元信息,如其狀態,邏輯名稱等}。模型不僅僅是'配置文件',因爲它是邏輯規範,你的程序將是本規範的解釋器。 XML比屬性文件更結構化。 – Aubin 2013-03-06 21:32:05

+0

另外你對「作業」之間的並行性和同步性有什麼意義?我如何捕捉? – Cratylus 2013-03-06 21:36:04