说明
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