The simple, stupid workflow engine for Java
- 源代碼名稱:easy-flows
- 源代碼網址:http://www.github.com/j-easy/easy-flows
- easy-flows 源代碼文檔
- easy-flows 源代碼下載
Git URL
git://www.github.com/j-easy/easy-flows.git
Git Clone 代碼到本地
git clone http://www.github.com/j-easy/easy-flows
Subversion 代碼到本地
$ svn co --depth empty http://www.github.com/j-easy/easy-flows
Checked out revision 1.
$ cd repo
$ svn up trunk
最新新聞
12/03/2020:第2個版本的新增了一個 WorkContext(工作上下文信息),類似於Bus總線思路,所有節點都可以共享 WorkContext 信息。
什麼是容易流?
輕鬆流是Java的工作流引擎。 它提供簡單的api和構建塊,以方便創建和運行可以組合工作流。
簡單流程中的工作單元由 Work
接口表示。 工作流由 WorkFlow
接口表示。 輕鬆流提供 WorkFlow
接口的4實現:
這些是你需要知道的唯一基本流,以便開始創建簡單流程的工作流。 你不需要學習複雜的符號或者概念,只是一些簡單易於思考的自然 api。
它是如何工作的?
首先,讓我們寫一些Work:
class PrintMessageWork implements Work {
private String message;
public PrintMessageWork(String message) {
this.message = message;
}
public String getName() {
return "print message work";
}
public WorkReport call(WorkContext workContext) {
System.out.println(message);
return new DefaultWorkReport(WorkStatus.COMPLETED, workContext);
}
}
這裏工作單元將給定消息打印到標準輸出。 現在假設我們想創建以下工作流:
- 打印"foo"三次
- 然後並行打印"hello"和"world"
- 如果"hello"和"world"都已經成功打印到控制檯,則打印"ok",否則打印"nok"
這裏工作流可以如下所示:
flow1
是work1
的RepeatFlow
,它打印"foo"三次flow2
是work2
和work3
的ParallelFlow
,它並行地打印"hello"和"world"flow3
是一個ConditionalFlow
,它先執行flow2
( 工作流也是工作),如果flow2
完成,則執行work4
,否則將分別打印“ok”和“nok”。flow4
是一個SequentialFlow
它執行flow1
,然後按順序執行flow3
。
通過輕鬆流,可以使用以下代碼段實現這裏工作流:
PrintMessageWork work1 = new PrintMessageWork("foo");
PrintMessageWork work2 = new PrintMessageWork("hello");
PrintMessageWork work3 = new PrintMessageWork("world");
PrintMessageWork work4 = new PrintMessageWork("ok");
PrintMessageWork work5 = new PrintMessageWork("nok");
ExecutorService executorService = Executors.newFixedThreadPool(2);
WorkFlow workflow = aNewSequentialFlow() // flow 4
.execute(aNewRepeatFlow() // flow 1
.named("print foo 3 times")
.repeat(work1)
.times(3)
.build())
.then(aNewConditionalFlow() // flow 3
.execute(aNewParallelFlow(executorService) // flow 2
.named("print 'hello' and 'world' in parallel")
.execute(work2, work3)
.build())
.when(WorkReportPredicate.COMPLETED)
.then(work4)
.otherwise(work5)
.build())
.build();
WorkFlowEngine workFlowEngine = aNewWorkFlowEngine().build();
WorkContext workContext = new WorkContext();
WorkReport workReport = workFlowEngine.run(workflow, workContext);
executorService.shutdown();
這不是一個非常有用的工作流程,但是隻是爲了給你一個簡單的流程編寫工作流。 你可以在中找到關於所有這一切的更多細節。
爲什麼容易流?
由於缺少一個可以編排 Callable Java對象的簡單開源工作流引擎,因這裏創建了簡單流程。 爲什麼每個工作流引擎都在嘗試實現 BPMN? BPMN沒有什麼問題,但是它並不容易( 538頁規範是什麼)? )。對於 BPEL插件來說,同樣的東西。
目前有好的工作流引擎,但是由於它們試圖實現 BPMN,它們並不容易使用,而且常常被誤用。 大多數的BPMN概念對於許多應用都不是必需的,在重引擎之上構建這樣的應用程序是不有效的。
簡單流程嘗試提供簡單的自然api替代方法,以及大多數小型/中小型應用程序的基本流。 如果你的業務流程需要一個 for,那麼簡單的流程可以能不是你的選擇。