說明
flowable的監聽器支持流程在運行過程中各種狀態的AOP處理,默認僅僅應用類的class回調,但是跨系統或者跨服務需要通過http 或者MQ完成回調通知,所以新增http回調擴展,使對接方可以在任意流程狀態完成監聽回調處理自身的業務邏輯
同時url支持表達式配置可以調用方可以獲取自己關心的參數如:
https://demeter-dev.biaoguoworks.com/scm/flowable-center-notify?id=${businessKey}&taskName=${taskName}&status=${status}
則可以拿到 自身業務id 當前任務名字 和當前任務狀態
注:${} 可以拿到存在的流程變量

源碼改造思路
1.首先flowable是通過xml來建模的,描述一個流程的走向和相關配置。那么在運行中流程就會轉換成運行時結構,也就是我們java對象的形式。
如:我們原生配置類的方式
<userTask id="sid-47205900-DFBE-4720-A773-98C7970A74A9"> <extensionElements> <flowable:executionListener event="start" class="com.biaoguoworks.flowable.custom.listener.HttpListener"></flowable:executionListener> </extensionElements> </userTask>
我的想法是如果配置http可以這樣表述
<extensionElements> <flowable:executionListener event="start" http="https://demeter-dev.biaoguoworks.com/scm/flowable-center-notify?id=${ businessKey}&taskName=${taskName}&status=${status}"></flowable:executionListener> </extensionElements>
1.我們一般都是用模型設計器來建模 模型設計器是通過建模后提交的數據是json格式持久化
詳情可以見這個表
#流程模型 保存了模型的BMP建模 可以通過模型數據進行流程部署 type=2為表單引擎的模型 select * from act_de_model;
將JSON轉換成XML部署最終持久化到這2個表
#流程定義表 每次部署產生一次定義 運行時流程關聯 對應流程相關就是 ProcessDefinition select * from act_re_procdef f where f.DEPLOYMENT_ID_='af8c0616-a50d-11ec-9fe1-3253401383d9' #資源文件表流程模型資源文件的真正存放地方,它每部署一次就會產生2條記錄,一條是關於bpmn規范的文件內容存放在BYTES字段中, #另一條是圖片信息,采用二進制格式存儲。提示:可以部署后解析bpmn文件的內容自動生成流程圖,實現流程圖的跟蹤線路。 select * from act_ge_bytearray y where y.DEPLOYMENT_ID_='af8c0616-a50d-11ec-9fe1-3253401383d9'
部署階段就是將json轉換為運行時結構(對象)再將運行時結構轉換成xml完成部署
執行階段就是將對應發起流程對應的流程定義的xml文件轉換成運行時結構,到了指定時機調用我們的監聽器
通過以上源碼改動有以下幾個點
1.模型設計器提交的json 針對監聽器增加如何描述http監聽器
2.部署階段
2.1將json轉換成運行時結構的class需要新增屬性能夠識別http監聽器
3.1 運行時機構轉換成xml需要支持識別http屬性並寫入對應節點
3.執行階段
1.xml轉換為BPMN對象識別http監聽器
2.通過BPMN對象對應時機調度監聽器可以識別http監聽器
針對模型設計提交的json改動
增加了http屬性詳見標紅處
忽略了部分代碼詳情可以根據模型設計添加監聽器看完整結構 原生設計器改動位置忘記了囧
{ "resourceId": "sid-47205900-DFBE-4720-A773-98C7970A74A9", "properties": { "overrideid": "", "name": "", "documentation": "", "asynchronousdefinition": "false", "exclusivedefinition": "false", "executionlisteners": { "executionListeners": [{ "event": "start", "implementation": "", "className": "", "expression": "", "delegateExpression": "", "fields": [], "$$hashKey": "uiGrid-002D", "http": "ttps://demeter-dev.biaoguoworks.com/scm/flowable-center-notify?id=${ businessKey}&taskName=${taskName}&status=${status}" }] }, "multiinstance_type": "None", "multiinstance_cardinality": "", "multiinstance_collection": "", "multiinstance_variable": "", "multiinstance_condition": "", "isforcompensation": "false", "usertaskassignment": "", "formkeydefinition": "", "formreference": "", "duedatedefinition": "", "html_form_url": "", "detail_html_form_url": "", "prioritydefinition": "", "formproperties": "", "tasklisteners": "", "skipexpression": "", "categorydefinition": "", "process_button": "辦理,駁回,流程終止", "autocompletetask": "false", "startusercommitnode": "false" }, "stencil": { "id": "UserTask" }, "childShapes": [], "outgoing": [{ "resourceId": "sid-E05A628C-7A43-4DBE-9DDC-2C1A248EE826" }], "bounds": { "lowerRight": { "x": 265, "y": 200 }, "upperLeft": { "x": 165, "y": 120 } }, "dockers": [] } }
針對部署改動
1.針對json轉運行時PBMN對象處
com.biaoguoworks.flowable.custom.convert.CustomBpmnJsonConverterUtil#parseListeners增加了解析設置類型區分是否是http監聽器
else if (StringUtils.isNotEmpty(getValueAsString(ATTRIBUTE_LISTENER_HTTP, listenerNode))) { listener.setImplementationType(CustomFlowableListenerParser.IMPLEMENTATION_TYPE_HTTP); listener.setImplementation(getValueAsString(ATTRIBUTE_LISTENER_HTTP, listenerNode)); }
2.針對BPMN轉換對應XML處
com.biaoguoworks.flowable.custom.parse.CustomFlowableListenerParser#parse
執行階段改動
流程引擎調度過程中觸發監聽需要能夠識別http監聽器
com.biaoguoworks.flowable.custom.config.CustomListenerNotificationHelper#executeExecutionListeners