怎么实现Activiti的分支条件的自定义配置

 我来答
huanglenzhi
2016-01-13 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517191
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

一、Activiti的流程分支条件的局限

Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示:


 

   <sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">
     <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>
   </sequenceFlow>
   <sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">
     <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>
   </sequenceFlow>
   <sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">
     <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>
   </sequenceFlow>

 

 

从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:

1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写

2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。

 

以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷新流程定义的引擎缓存,如下的代码就是基于这种方式:

 

JsonNode jsonObject=objectMapper.readTree(configJson);
 JsonNode configsNode=jsonObject.get("configs");
   
 BpmSolution bpmSolution=bpmSolutionManager.get(solId);
 BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId());
    ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId());
    String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId());
   
    System.out.println("xml:"+processDefXml);
   
    ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId);
    ByteArrayInputStream is=new ByteArrayInputStream(processDefXml.getBytes());
   

   
    if(configsNode!=null){
    //取得分支条件列表
    JsonNode configs=configsNode.get("conditions");
    if(configs!=null){
    Iterator<JsonNode> it=configs.elements();
    while(it.hasNext()){
    ObjectNode config=(ObjectNode)it.next();
    String tmpNodeId=config.get("nodeId").textValue();
    String tmpCondition=config.get("condition").textValue();
   
    Element seqFlow=(Element)rootEl.selectSingleNode("/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='"
    +sourceNode.getNodeId()+"' and @targetRef='"+tmpNodeId+"']");
    if(seqFlow==null) continue;
   
    Element conditionExpress=(Element)seqFlow.selectSingleNode("bpm:conditionExpression");
    if(conditionExpress==null){
    conditionExpress=seqFlow.addElement("conditionExpression");
      conditionExpress.addAttribute("xsi:type", "tFormalExpression");
    }else{
    conditionExpress.clearContent();
    }
    conditionExpress.addCDATA(tmpCondition);
 
    }
    }
    }
//修改流程定义的XML,并且清空该流程定义的缓存
    actRepService.doModifyXmlAndClearCache(bpmDef.getActDefId(),bpmDef.getActDepId(), doc.asXML());

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式