一、什麼是工作流?為什麼需要工作流引擎?

Q1:工作流解決了什麼問題?不用引擎直接寫 if-else 不行嗎?

  • 痛點:
  • 審批流程頻繁變更(如:3級審批 → 5級)
  • 流程節點權限複雜(部門經理、HR、財務)
  • 需要歷史軌跡、催辦、轉辦、撤回等能力
  • 人工代碼維護成本高、易出錯
  • 工作流引擎的價值:
  • 流程與業務解耦:流程定義(BPMN 文件)獨立於 Java 代碼
  • 可視化建模:業務人員可參與流程設計
  • 內置能力:任務分配、超時處理、子流程、並行網關
  • 審計追蹤:完整記錄流程執行歷史

類比:
工作流引擎 ≈ 數據庫之於文件存儲 —— 提供事務、索引、查詢等基礎設施。

二、主流工作流引擎對比

Q2:Activiti、Flowable、Camunda 有何區別?如何選型?

特性

Activiti (Alfresco)

Flowable (Activiti 分支)

Camunda

起源

JBoss jBPM 衍生

Activiti 社區不滿後 fork

Activiti 創始人另起爐灶

活躍度

低(更新慢)

⭐⭐⭐⭐(社區活躍)

⭐⭐⭐⭐⭐(商業+開源)

BPMN 支持

基礎

完整 + CMMN/DMN

完整 + 強大 Modeler

性能

一般

優化良好

極致優化(輕量、高性能)

微服務支持

中(支持事件驅動)

⭐⭐⭐⭐(Zeebe 子項目專為雲原生設計)

推薦場景

老項目維護

新項目首選(Spring Boot 友好)

高要求企業級/雲原生

現狀:
Flowable 是目前 Java 社區最推薦的開源選擇,Camunda 在金融、航空等領域有深厚積累。

三、BPMN 2.0 核心元素

Q3:BPMN 2.0 中常見的流程元素有哪些?請舉例説明。

  • 核心元素:
  • 開始事件(Start Event):流程起點
  • 用户任務(User Task):需人工處理的節點(如“部門經理審批”)
  • 服務任務(Service Task):自動執行 Java 邏輯(如“發送郵件”)
  • 網關(Gateway)
  • 排他網關(Exclusive):if-else 分支
  • 並行網關(Parallel):fork/join 並行執行
  • 結束事件(End Event):流程終點
  • 子流程(Sub-Process):封裝複雜邏輯
  • 示例:請假流程
[開始] → [填寫請假單] → [部門經理審批]
            ↓ 同意
        [HR備案] → [結束]
            ↑ 拒絕
        [通知申請人]

關鍵點:
BPMN 是標準規範,不同引擎對其支持程度略有差異。

四、流程部署與啓動

Q4:如何在 Java 中部署和啓動一個流程?

// 1. 部署 BPMN 文件
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
    .addClasspathResource("leave.bpmn20.xml")
    .deploy();

// 2. 啓動流程實例
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("applicant", "張三");
variables.put("days", 5);
ProcessInstance instance = runtimeService
    .startProcessInstanceByKey("leaveProcess", variables);
  • 關鍵概念:
  • Deployment:流程定義的部署單元
  • ProcessDefinition:流程模板(只讀)
  • ProcessInstance:一次流程運行實例
  • Execution:流程執行路徑(支持並行分支)