activiti升級到flowable

最近公司的項目須要升級acitiviti到flowable,作了好多的準備工做,總結一下,分享給須要愛學習的人。mongodb

1.修改配置文件數據庫

flowable.database-schema-update=truejson

2.從 act_re_model 複製到 act_de_model架構

INSERT INTO act_de_model(id,NAME,model_key,last_updated,created,VERSION,tenant_id,model_type,model_editor_json,created_by,last_updated_by) SELECT id_ AS id,name_ AS NAME,key_ AS model_key,LAST_UPDATE_TIME_ AS last_updated,CREATE_TIME_ AS created,VERSION_ AS VERSION,TENANT_ID_ AS tenant_id,0 AS model_type,META_INFO_ AS model_editor_json, 'admin' as created_by,'admin' as last_updated_by FROM act_re_model;併發

3.同步model的數據app

@Test
    public void testSyncModelDatas() throws Exception {
        List<Model> list = repositoryService.createModelQuery().list();
        int i = 0;
        for (org.flowable.engine.repository.Model model : list) {
            i++;
            byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId());
            org.flowable.ui.modeler.domain.Model m = modelService.getModel(model.getId());
            if (m != null) {
                try {
                    JsonNode editorNode = new ObjectMapper().readTree(modelEditorSource);
                    m.setModelEditorJson(editorNode.toString());
                    modelService.saveModel(m);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

4.監聽器兼容處理dom

public class BusinessCallListener implements TaskListener {

    private static final long serialVersionUID = -5140234938739863473L;
    protected Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * dubbo的類名
     */
    private Object clazzName; /** * 方法名 */
    private Object method; /** * 版本號 */
    private Object version; /**
     * 參數 多個的話用分號隔開 實例 userCode:00004737;status:1
     */
    private Object params;

    @Override
    public void notify(DelegateTask delegateTask)  {
        String clazzNameStr = "";
        String methodStr = "";
        String versionStr = "";
        String paramsStr = "";
        if (clazzName instanceof FixedValue){ clazzNameStr = ((FixedValue) clazzName).getExpressionText(); }else if(clazzName instanceof org.activiti.engine.impl.el.FixedValue) { clazzNameStr = ((org.activiti.engine.impl.el.FixedValue) clazzName).getExpressionText(); } if (method instanceof FixedValue){ methodStr = ((FixedValue) method).getExpressionText(); }else if(method instanceof org.activiti.engine.impl.el.FixedValue) { methodStr = ((org.activiti.engine.impl.el.FixedValue) method).getExpressionText(); } if (version instanceof FixedValue){ versionStr = ((FixedValue) version).getExpressionText(); }else if(version instanceof org.activiti.engine.impl.el.FixedValue) { versionStr = ((org.activiti.engine.impl.el.FixedValue) version).getExpressionText(); } if (params instanceof FixedValue){ paramsStr = ((FixedValue) params).getExpressionText(); }else if(params instanceof org.activiti.engine.impl.el.FixedValue) { paramsStr = ((org.activiti.engine.impl.el.FixedValue) params).getExpressionText(); }

        IDynamDubbo dynamDubbo = SpringContextHolder.getBean("dynamDubboImpl");
        ExecutionEntity execution = ExecutionHelper.getExecution(delegateTask.getProcessInstanceId());
        String businessKey = execution.getBusinessKey();
        try {
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("businessKey", businessKey);
            if (StringUtils.isNotBlank(paramsStr)) {
                String[] ps = paramsStr.split(";");
                if (ps != null && ps.length > 0) {
                    for (String p : ps) {
                        String[] split = p.split(":");
                        if (split != null && split.length > 0) {
                            paramMap.put(split[0], split[1]);
                        }
                    }
                }
            }
            String paramsJson = JsonUtils.toJson(paramMap);
            //執行dubbo方法
            logger.debug("開始調用業務系統接口" + clazzNameStr + "." + methodStr + ",業務參數:" + paramsJson);
            dynamDubbo.invoke(clazzNameStr, methodStr, versionStr, paramsJson);
        } catch (Exception e) {
            logger.error("調用業務系統的方法失敗", e);
            //添加容錯信息
            FlowBuesinessException fbe = new FlowBuesinessException(clazzNameStr,
                    methodStr, versionStr, businessKey, e.getMessage());
            this.createWfBuesinessException(fbe);
        }
    }

    //添加容錯信息
    private void createWfBuesinessException(FlowBuesinessException fbe){
        IFlowBuesinessExceptionService flowBuesinessExceptionService = SpringContextHolder.getBean("flowBuesinessExceptionServiceImpl");
        try {
            flowBuesinessExceptionService.insertFlowBuesinessException(fbe);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. flowable-ui-modeler 集成分佈式

這個太多了,後面作一個系統講解ide

6.集成效果微服務

6.1 自定義表單

6.2 流程在線編輯

6.3. 門戶對接

 

 

 

7. 集成mongodb 提高查詢已辦任務和我發起的流程實例

爲何集成mongodb?

咱們的歷史任務並非不少,當我在150w的時候,查詢已辦任務和我發起的流程就至關慢,已辦任務足足耗時3分鐘,這個沒法知足咱們的業務需求,無奈之下才集成mongodb的,如今查詢的速度在0.005s以內,提高性能上萬倍。

大大提高了用戶體驗。

7.1. 按照flowable提供的實例直接在mongodb裏面生成本身的相關表,可是他在你關係數據庫中就不會生成數據了

7.2.按照本身約定的規則把流程實例和流程任務和其餘表關聯的信息存放到mongodb中,方便查詢

我這邊採用的是第二種方式

8.當前的數據量

改版上線以後大大提高了流程的對接效率和指定行之有效的流程策略。

天天以5-10的流程模板遞增,1500個業務表單提交,6500個處理任務。

9.流程中心將來發展

因爲當前的流程中心是基於flowable作的二次封裝,因此也會一直更新flowable的版本,跟官方一致。

流程中心採用微服務分佈式集羣架構,因此對高併發大數據裏無任何影響。

目標是支持公司至少天天10w個表單提交,80w個待辦任務處理,1w個流程模板。