flowable-流程中心设计之http监听器(十)


说明

  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