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