阿里開源工作流框架 compileflow 上手使用


compileflow 是什么

compileflow 是一個非常輕量、高性能、可集成、可擴展的流程引擎。

compileflow Process 引擎是淘寶工作流 TBBPM 引擎之一,是專注於純內存執行,無狀態的流程引擎,通過將流程文件轉換生成 java 代碼編譯執行,簡潔高效。當前是阿里業務中台交易等多個核心系統的流程引擎。

compileflow 能讓開發人員通過流程編輯器設計自己的業務流程,將復雜的業務邏輯可視化,為業務設計人員與開發工程師架起了一座橋梁。

功能列表

  • 高性能:通過將流程文件轉換生成 java 代碼編譯執行,簡潔高效。
  • 豐富的應用場景:在阿里巴巴中台解決方案中廣泛使用,支撐了導購、交易、履約、資金等多個業務場景。
  • 可集成:輕量、簡潔的設計使得可以極其方便地集成到各個解決方案和業務場景中。
  • 完善的插件支持:流程設計目前有 IntelliJ IDEA、Eclipse 插件支持,可以在流程設計中實時動態生成 java 代碼並預覽,所見即所得。
  • 支持流程設計圖導出 svg 文件和單元測試代碼。
  • 支持基於 Java 反射和 Spring 容器的代碼觸發

快速上手

  • 引入 compileflow jar 依賴
<dependency>
    <groupId>com.alibaba.compileflow</groupId>
    <artifactId>compileflow</artifactId>
    <version>1.0.0</version>
</dependency>
  • 使用 compileflow 繪制了簡單的流程圖

IDEA 插件

  • 查看編譯出的流程業務Java代碼(以下代碼為compileflow自動根據流程圖生成的)
public class PigFlow implements ProcessInstance {

    private java.lang.Integer price = null;

    public Map<String, Object> execute(Map<String, Object> _pContext) throws Exception {
        price = (Integer)DataType.transfer(_pContext.get("price"), Integer.class);
        Map<String, Object> _pResult = new HashMap<>();
        decision8();
        //AutoTaskNode: 付款
        ((BizMock)ObjectFactory.getInstance("com.example.compileflow.bean.BizMock")).payMoney(price);
        _pResult.put("price", price);
        return _pResult;
    }

    private void decision8() {
        //DecisionNode: 計算費用
        bizMockCalMoney();
        if (price>=100) {
            //超過100
            {
                //ScriptTaskNode: 春哥請客 腿打折
                IExpressContext<String, Object> nfScriptContext = new DefaultContext<>();
                nfScriptContext.put("price", price);
                price = (java.lang.Integer)ScriptExecutorProvider.getInstance().getScriptExecutor("QL").execute("price*2", nfScriptContext);
            }
        } else {
            //不超過100
            {
                //ScriptTaskNode: 冷冷請客 打5折
                IExpressContext<String, Object> nfScriptContext = new DefaultContext<>();
                nfScriptContext.put("price", price);
                price = (java.lang.Integer)ScriptExecutorProvider.getInstance().getScriptExecutor("QL").execute("(round(price*0.5,0)).intValue()", nfScriptContext);
            }
        }
    }

    private void bizMockCalMoney() {
        price = ((BizMock)ObjectFactory.getInstance("com.example.compileflow.bean.BizMock")).calMoney(price);
    }

}
  • 在設計好的 bpm 文件右鍵創建 單元測試

bpm單元測試

@Test
public void testProcess() throws Exception {
    String code = "pig";
    ProcessEngine<TbbpmModel> engine = ProcessEngineFactory.getProcessEngine();
    System.out.println(engine.getJavaCode(code));
    Map<String, Object> context = new HashMap<>();
    context.put("price", 10);

    Map<String, Object> execute = engine.execute(code, context);

    System.out.println(execute);
}
  • 執行流程單元測試,輸出目標過程
假裝在計算金額~~~~~~10
支付了~~~~~~5

總結

  • compileflow 極其容易上手,降低工作流學習的難度。

  • compileflow IDEA 設計插件在 2021 版本兼容性存在問題。

  • 自動生成的單元測試代碼依賴版本較低不支持 Junit5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM