Easy-Flows - Java的簡單愚蠢的工作流引擎

The simple, stupid workflow engine for Java

 

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,那麼簡單的流程可以能不是你的選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章