2014-09-24 37 views
8

我已經創建了幾個任務,每個任務都需要一個輸入,一個執行功能,不斷更新其狀態,以及一個獲取該任務輸出的函數。它們將以串行或並行方式執行。有些輸出是List,所以也會有循環。如何從現有的代碼製作簡單的工作流程?

public class Task1 { //each task looks like this 
    void addInput(String key, String value){ 
     .... 
    } 
    void run(){ 
     .... 
     updateStatus(); 
     .... 
    } 
    HashMap getOutput(){ 
     .... 
    } 
    Status getStatus(){ 
     .... 
    } 
} 

我要讓這些任務的工作流程,然後我將使用工作流結構的信息來構建一個動態的圖形用戶界面和監控每個任務的輸出。我是否必須從頭開始編寫工作流執行系統,還是有其他簡單的選擇?

是否有任何工作流引擎可以給我(在XML中可能)我的Java類,輸入和輸出以及執行函數並讓它執行?

+2

您正在尋找[BPEL引擎](http://en.wikipedia.org/wiki/Business_Process_Execution_Language)。 – CodeNewbie 2014-09-24 11:21:43

+0

我不確定你的項目的使用情況。對於商業,學校項目或只是個人學習? – Jiang 2014-09-28 13:53:59

+0

@Jiang我把它作爲我的研究項目的原型/概念證明。它關於自動化工作流程。我正在製作測試用例工作流程。這是一個科學的工作流程,搜索DNA,轉換成蛋白質,找到同源性,蛋白質建模和最終模型驗證。每一步都使用各種服務。 – SMUsamaShah 2014-09-28 19:52:56

回答

2

結帳Activity。這不是嚴格設計來解決你的用例,但是你可以使用和調整它的流程引擎來幫助你,因爲它純粹是用java編寫的。活動更像是過程建模引擎,因此它不是爲了控制在運行時並行運行的任務而設計的,因此您可以獲得許多可以「重新使用」的內容。

  • 你會得到任務鏈接立足於XML文件
  • 你會得到你的GUI用於連接任務免費(立足蝕)
  • 您將獲得在Web瀏覽器的圖形用戶界面來瀏覽正在運行的進程,開始新的,並查看任務的當前狀態:http://activiti.org/userguide/index.html#N12E60
  • 您將獲得免費的報告引擎,您可以在其中看到報告和圖表(「任務需要多長時間」,「流程運行了多長時間」
  • 您將免費獲得REST API。其他應用程序將是abl e通過簡單的REST調用來獲取應用程序的當前狀態

因此,在這個方向上您將獲得許多免費的東西。從程序員的角度來看,你可以例如繼承自Activity api的Task類。當任務完成後,請致電

taskService.complete(task.getId(), taskVariables); 

你也可以繞着另一條路走。因此,假設你在後臺計算的類叫做CalculationTask,你可以將CalculatinTasks和Activity Task的新實例連接起來。通過這個,你將獲得一個到Activity過程引擎的橋樑。所以你可以做類似於

class CustomActivityTask extends Task { // inherit from Activity Task class to add your own fields 
    private int someStateOne; 
    private String someOtherState; 

    (...) 
    // getters and setters 

} 

class CalculationTask { 
    private CustomActivityTask avtivityTask; // by updating the state of this task you are updating the state of the task in Activity process engine 
    private RuntimeService activityRuntimeServiece; 

    public void run() { // this is your execution functin 

     while (true) { 
     // calulate 
     activityTask.setSomeStateOne(45) 
     activityTask.setSomeOtherState("Task is almost completing..."); 

     (...) 

     if (allCompleted) { 
      activityRuntimeServiece.complete(avtivityTask.getId(), taskVariables); 
      break; 

     } 

    } 
} 
4

在Java世界中,您的用例被稱爲BPM(業務流程管理)。

在.Net世界中,這被稱爲Windows Workflow Foundation(WWF)。

有很多基於java的開源BPM工具。我喜歡的那個是jBPM

這是更強大,可以與規則引擎如Drools集成。

樣品jBPM的截圖: jBPM Diagram

而且Activiti是另一個不錯的選擇。

樣品Activiti的屏幕截圖: Activiti Diagram

+0

jBPM是400MB的大小,並不容易與現有的類使用。儘管Activiti看起來很簡單。 – SMUsamaShah 2014-10-04 09:26:28

2

Apache Camel是一個開放源碼的集成框架,可以用來作爲一個輕量級工作流系統。路由可以用Java,XML,Groovy或Scala DSL來定義。 Apache Camel包含綜合監控能力。除此之外,您可以使用外部監視工具,例如Hawtio

也看看Work Flow in Camel vs BPM

2

也許State Chart XML (SCXML)可以幫到你。目前它是W3C發佈的工作草案規範

SCXML提供基於Harel狀態表的基於狀態機的通用執行環境。

apache基礎提供了一個java實現,我們(我的公司)正在使用它來執行「作業」的狀態轉換。這裏是Apache Commons SCXML實施

1

看看銅引擎http://copper-engine.org/

不同的Activiti和這樣的,它不要求寫一噸的XML只是爲了獲得一個簡單的工作流去

+0

它沒有記錄。我在哪裏可以找到它的幫助,API等? – SMUsamaShah 2014-10-04 09:09:04

+0

javadoc可以從maven central以jar的形式獲得,並且不會因爲某些原因而在它們的github上。無論如何,我的團隊發現銅相當缺乏。它沒有你從工作流系統期望的一些基本的東西 - 比如定義一個有限狀態機的能力。一個工作流程幾乎是一個FSM和銅沒有任何這個概念。您只需定義一個Java類,並在使用其定製版本的wait()等待完成外部事件時必須保持輪詢。我強烈鼓勵人們去其他地方看看。 – chairbender 2017-06-27 21:42:18

2

如果分析是耗時的,你不需要立即反饋,那麼也許你根本不需要工作流引擎,只需要一個批處理器。看看Spring Batch項目,它可以與Camel Apache一起使用(請參閱我的其他答案以獲取關於此選項的更多信息)。

1

我肯定會考慮the Apache Storm project。 Storm被設計成一個易於擴展的並行計算引擎。在其許多特性中,其易於管理,容錯和一般的簡單設置(相對於其他類似Hadoop的技術,我相信)可能會對原型系統有吸引力。

工作流將類似於Storm拓撲;不同的任務將是流;並且任務中的不同方法將對應於spoutsbolts。此外,Storm在其API中支持多種編程語言,如Hadoop。

Storm最初是由Twitter設計的,然後是開源的,類似於Cassandra(Facebook)和Hadoop本身(Yahoo!)等其他項目。對用戶來說,這意味着它是爲實際使用而建立的,而不是純粹的理論概念。這也是相當戰鬥測試。

我希望這對你有用,祝你的項目一切順利!