Flowable -- 工作流引擎

術(shù)語(yǔ)

Workflow:工作流灾部,即在計(jì)算機(jī)中自動(dòng)化運(yùn)行的業(yè)務(wù)流程
WfMS:Workflow Management System,工作流管理系統(tǒng)
BPM:Business Process Management别洪,業(yè)務(wù)流程管理
PVM:Process Virtual Machine母债,流程虛擬機(jī)

OMG:Object Management Group(對(duì)象管理組織)暇昂,一個(gè)致力于建立( 程序舶得、系統(tǒng)掰烟、業(yè)務(wù)流程)建模標(biāo)準(zhǔn)的國(guó)際協(xié)會(huì)
OASIS:Organizationfor the Advancement of Structured Information Standards,結(jié)構(gòu)化信息標(biāo)準(zhǔn)促進(jìn)組織
WfMC:Workflow Management Coalition沐批,工作流程管理聯(lián)盟

XPDL:XML Process Definition Language纫骑,WfMC提出的業(yè)務(wù)流程描述規(guī)范
JPDL:JBoss jBPM Process Definition Language,jBPM的業(yè)務(wù)流程描述標(biāo)準(zhǔn)
BPEL:Business Process Execution Language九孩,業(yè)務(wù)過(guò)程執(zhí)行語(yǔ)言先馆,用來(lái)描述業(yè)務(wù)過(guò)程的XML規(guī)范
WSBPEL(BPEL-WS):Web Services Business Process Execution Language,OASIS發(fā)布的Web服務(wù)形式的BPEL
BPDM:Business Process Definition Metamodel躺彬,業(yè)務(wù)流程定義元模型磨隘,OMG組織提出的用來(lái)解決BPMN存儲(chǔ)和交換問(wèn)題的規(guī)范
BPMN:Business Process Model and Notation缤底,OMG推出的業(yè)務(wù)流程圖標(biāo)準(zhǔn)
CMMN:Case Management Model and Notation,OMG發(fā)布的案例管理圖標(biāo)準(zhǔn)番捂,是對(duì)BPMN的擴(kuò)展;它用聲明式表示法來(lái)描述流程
DMN:Decision Modeling Notation江解,OMG發(fā)布的決策建模圖標(biāo)準(zhǔn)设预,用于封裝BPMN中的業(yè)務(wù)決策邏輯(業(yè)務(wù)規(guī)則)

OA:Office Automation,辦公自動(dòng)化系統(tǒng)
ERP:Enterprise Resource Planning犁河,企業(yè)資源管理系統(tǒng)
CRM:Customer Relationship Management鳖枕,客戶(hù)關(guān)系管理系統(tǒng)

各種工作流引擎

jBPM(java Business Process Management):Tom Baeyens(湯姆 貝恩斯)于2003年發(fā)布,于2004 年加入JBoss桨螺,jBPM4引入了PVM宾符;而后Tom Baeyens離開(kāi)了JBoss,jBPM5 放棄了 jBPM 4灭翔,基于Drools Flow重頭來(lái)過(guò)
Activiti:Tom Baeyens離開(kāi)了JBoss后加入了Alfresco魏烫,于2010年推出了Activiti 5,Activiti 6移除了PVM
Camunda BPM:2012年Activiti的貢獻(xiàn)者之一Camunda(卡蒙達(dá))肝箱,從Activiti 5項(xiàng)目fork出一個(gè)新項(xiàng)目哄褒,即Camunda BPM
Flowable:2016年Activiti的開(kāi)發(fā)者之一Tijs Rademakers,從Activiti 6項(xiàng)目fork出一個(gè)新項(xiàng)目煌张,即Flowable 6

Osworkflow:OpenSymphony組織開(kāi)發(fā)的工作流引擎
馳騁BPM(ccbpm呐赡、JFlow):濟(jì)南馳騁信息技術(shù)有限公司開(kāi)發(fā)的工作流引擎
其他:Bonitasoft、Enhydra Shark骏融、ProcessMaker链嘀、Apache ODE等

相關(guān)資源

Drools:JBoss出品規(guī)則引擎
Drools Flow:Drools 的工作流組件

選型

Camunda功能較多,F(xiàn)lowable更活躍

Flowable 知識(shí)

官網(wǎng):https://www.flowable.org

五個(gè)官方應(yīng)用(包含于Flowable下載包里的wars目錄)
flowable-modeler.war:流程定義管理
flowable-task.war:用戶(hù)任務(wù)管理
flowable-idm.war:用戶(hù)組權(quán)限管理
flowable-rest.war:流程引擎對(duì)外提供的API接口
flowable-admin.war:后臺(tái)管理
流程設(shè)計(jì)器:將 flowable-modeler.war 和 flowable-idm.war部署到tomcat档玻,即可得到網(wǎng)頁(yè)版流程設(shè)計(jì)器(訪問(wèn)路徑為 /flowable-modeler怀泊,默認(rèn)賬號(hào)為 admin/test )

Flowable五大引擎(包含于Flowable下載包里的libs目錄)
ProcessEngine(流程引擎)、DmnEngine(決策引擎)窃肠、IdmEngine(身份識(shí)別引擎)包个、ContentEngine(內(nèi)容引擎)、FormEngine(表單引擎)

應(yīng)用首次啟動(dòng)時(shí)冤留,F(xiàn)lowable會(huì)往數(shù)據(jù)庫(kù)里添加一些表
ACT_RE_ *:RE代表repository碧囊。具有此前綴的表包含靜態(tài)信息,例如流程定義和流程資源(圖像纤怒,規(guī)則等)糯而。
ACT_RU_ *:RU代表runtime。這些是包含運(yùn)行時(shí)的流程實(shí)例泊窘,用戶(hù)任務(wù)熄驼,變量像寒,作業(yè)等的運(yùn)行時(shí)數(shù)據(jù)的運(yùn)行時(shí)表。Flowable僅在流程實(shí)例執(zhí)行期間存儲(chǔ)運(yùn)行時(shí)數(shù)據(jù)瓜贾,并在流程實(shí)例結(jié)束時(shí)刪除記錄诺祸。這使運(yùn)行時(shí)表保持小而快。
ACT_HI_ *:HI代表history祭芦。這些是包含歷史數(shù)據(jù)的表筷笨,例如過(guò)去的流程實(shí)例,變量龟劲,任務(wù)等
ACT_GE_ :general數(shù)據(jù)胃夏,用于各種用例
ACT_ID_
:Idm的用戶(hù)、組

Flowable應(yīng)用組成

1昌跌、創(chuàng)建 SpringBoot + Mybatis 項(xiàng)目
2仰禀、pom.xml

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.5.0</version>
</dependency>

3、流程配置xml(放在/resources/processes下蚕愤,以 .bpmn2.xml 為后綴)答恶,可以由流程設(shè)計(jì)器導(dǎo)出

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
             xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
             typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
             targetNamespace="http://www.flowable.org/processdef">
    <process id="Leave" name="LeaveProcess" isExecutable="true">
        <userTask id="leaveTask" name="請(qǐng)假" flowable:assignee="${leaveTask}"/>
        <userTask id="managerTask" name="經(jīng)理審核"/>
        <exclusiveGateway id="managerJudgeTask"/>
        <endEvent id="endLeave" name="結(jié)束"/>
        <startEvent id="startLeave" name="開(kāi)始"/>
        <sequenceFlow id="modeFlow" sourceRef="leaveTask" targetRef="managerTask"/>
        <sequenceFlow id="flowStart" sourceRef="startLeave" targetRef="leaveTask"/>
        <sequenceFlow id="jugdeFlow" sourceRef="managerTask" targetRef="managerJudgeTask"/>
        <endEvent id="endLeave2"/>
        <sequenceFlow id="flowEnd" name="通過(guò)" sourceRef="managerJudgeTask" targetRef="endLeave">
            <conditionExpression xsi:type="tFormalExpression">
                <![CDATA[${checkResult=='通過(guò)'}]]>
            </conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="rejectFlow" name="駁回" sourceRef="managerJudgeTask"
                      targetRef="endLeave2">
            <conditionExpression xsi:type="tFormalExpression">
                <![CDATA[${checkResult=='駁回'}]]>
            </conditionExpression>
        </sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_process">
        <bpmndi:BPMNPlane bpmnElement="Leave" id="BPMNPlane_process">
            <bpmndi:BPMNShape bpmnElement="leaveTask" id="BPMNShape_leaveTask">
                <omgdc:Bounds height="79.99999999999999" width="100.0" x="304.60807973558974" y="122.00000000000001"/>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="managerTask" id="BPMNShape_managerTask">
                <omgdc:Bounds height="80.0" width="100.0" x="465.0" y="122.0"/>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="managerJudgeTask" id="BPMNShape_managerJudgeTask">
                <omgdc:Bounds height="40.0" width="40.0" x="611.5" y="142.0"/>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="endLeave" id="BPMNShape_endLeave">
                <omgdc:Bounds height="28.0" width="28.0" x="696.5" y="148.0"/>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="startLeave" id="BPMNShape_startLeave">
                <omgdc:Bounds height="30.0" width="30.0" x="213.2256558149128" y="147.0"/>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="endLeave2"
                              id="BPMNShape_endLeave2">
                <omgdc:Bounds height="28.0" width="28.0" x="617.5" y="73.32098285753572"/>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="flowEnd" id="BPMNEdge_flowEnd">
                <omgdi:waypoint x="651.1217948717949" y="162.37820512820514"/>
                <omgdi:waypoint x="696.5002839785394" y="162.0891701657418"/>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="rejectFlow" id="BPMNEdge_rejectFlow">
                <omgdi:waypoint x="631.866093577786" y="142.36609357778607" />
                <omgdi:waypoint x="631.5931090276993" y="101.32067323657485" />
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="modeFlow" id="BPMNEdge_modeFlow">
                <omgdi:waypoint x="404.60807973558974" y="162.0" />
                <omgdi:waypoint x="465.0" y="162.0" />
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flowStart" id="BPMNEdge_flowStart">
                <omgdi:waypoint x="243.2256558149128" y="162.0" />
                <omgdi:waypoint x="304.60807973558974" y="162.0" />
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="jugdeFlow" id="BPMNEdge_jugdeFlow">
                <omgdi:waypoint x="565.0" y="162.21367521367523" />
                <omgdi:waypoint x="611.9141630901288" y="162.41416309012877" />
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

4、Controller

@RestController
@RequestMapping(value = "/flow")
public class FlowController {
    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @ApiOperation(value = "實(shí)例化一個(gè)流程")
    @RequestMapping(value = "/start", method = RequestMethod.POST)
    public String startLeaveProcess(@RequestParam String staffId) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("leaveTask", staffId);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("Leave", map);
        List<Task> tasks = taskService.createTaskQuery().taskAssignee(staffId).orderByTaskCreateTime().desc().list();
        return "processId:" + processInstance.getId() + ";首個(gè)task的id:" + tasks.get(0).getId();
    }

    @ApiOperation(value = "結(jié)束一個(gè)task")
    @RequestMapping(value = "/reject", method = RequestMethod.PUT)
    public String rejectTask(@RequestParam String taskId) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("checkResult", "駁回");
        taskService.complete(taskId, map);
        return "申請(qǐng)審核駁回";
    }
}

已有系統(tǒng)整合 IdmEngine

方案一:將已有系統(tǒng)中的用戶(hù)權(quán)限數(shù)據(jù) 同步到 ACT_ID_*表中
方案二:保留一方的表审胸,另一方通過(guò)數(shù)據(jù)庫(kù)視圖來(lái)訪問(wèn)數(shù)據(jù)

阿里云

Serverless 工作流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亥宿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砂沛,更是在濱河造成了極大的恐慌烫扼,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍庵,死亡現(xiàn)場(chǎng)離奇詭異映企,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)静浴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)堰氓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苹享,你說(shuō)我怎么就攤上這事双絮。” “怎么了得问?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵囤攀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我宫纬,道長(zhǎng)焚挠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任漓骚,我火速辦了婚禮蝌衔,結(jié)果婚禮上榛泛,老公的妹妹穿的比我還像新娘。我一直安慰自己噩斟,他們只是感情好曹锨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著剃允,像睡著了一般艘希。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硅急,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音佳遂,去河邊找鬼营袜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丑罪,可吹牛的內(nèi)容都是我干的荚板。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吩屹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跪另!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起煤搜,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤免绿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后擦盾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嘲驾,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年迹卢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辽故。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腐碱,死狀恐怖誊垢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情症见,我是刑警寧澤喂走,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站筒饰,受9級(jí)特大地震影響缴啡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓷们,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一业栅、第九天 我趴在偏房一處隱蔽的房頂上張望秒咐。 院中可真熱鬧,春花似錦碘裕、人聲如沸携取。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雷滋。三九已至文兢,卻和暖如春晤斩,著一層夾襖步出監(jiān)牢的瞬間姆坚,已是汗流浹背澳泵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工兼呵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔辅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓击喂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親懂昂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子介时,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344