【问题标题】:Activiti > bpmn : not able to assign candidate group dynamically using variablesActiviti > bpmn:无法使用变量动态分配候选组
【发布时间】:2016-05-26 06:28:51
【问题描述】:

我正在从 liferay 运行 activiti。 我正在尝试为用户任务动态设置候选组,为此我尝试了以下不起作用的解决方案。 这适用于 liferay 6.2 CE GA6 和 activiti 版本 5.18.0 如果我遗漏了什么或者您有更好的解决方案,请告诉我。

解决方案 1: 它关于使用过程变量为用户任务设置候选组。 以下是 bpmn 代码:

<userTask id="Review" name="Review"  activiti:candidateGroups=${assignee}>
  <extensionElements>
    <activiti:formProperty id="outputTransition" name="output Transition" type="enum">
      <activiti:value id="Approve" name="Approve"></activiti:value>
      <activiti:value id="Reject" name="Reject"></activiti:value>
    </activiti:formProperty>
  </extensionElements>
</userTask>

这里,assignee是已经设置好的流程变量。

在执行工作流时,我遇到了以下异常:

13:42:01,326 INFO  [http-bio-8080-exec-10][LiferayGroupsUtil:54] Convert    groups : [ ${assignee} ]
13:42:01,329 WARN  [http-bio-8080-exec-10][LiferayGroupsUtil:94] Cannot assign task to role ${assignee} com.liferay.portal.NoSuchRoleException: No Role exists with the key {companyId=20155, name=${assignee}}

解决方案 2:

我也尝试了下面的 xml 代码,但仍然遇到相同的异常: 在这里,我有 multiInstanceLoopCharacteristics。

<userTask id="Review" name="Review"  activiti:candidateGroups=${assignee}>
    <multiInstanceLoopCharacteristics isSequential="false" 
     activiti:collection="candidateGrp" activiti:elementVariable="assignee" >
    <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition>
  </multiInstanceLoopCharacteristics>
  <extensionElements>
    <activiti:formProperty id="outputTransition" name="output Transition" type="enum">
      <activiti:value id="Approve" name="Approve"></activiti:value>
      <activiti:value id="Reject" name="Reject"></activiti:value>
    </activiti:formProperty>
  </extensionElements>
</userTask>

解决方案 3:

我还尝试使用 DynamicBpmnService 动态设置候选组,请检查以下代码: 对于这种方法,我使用了 activiti 版本 5.19.0 我从 liferay > tomcat> webapp > activiti-web > web-inf >lib

替换了 activiti 引擎 jar
@Override
public void notify(DelegateExecution execution) {
    try {
    EngineServices engineServices = execution.getEngineServices();
    DynamicBpmnService dynamicBpmnService = engineServices.getDynamicBpmnService();
    ObjectNode infoNode = dynamicBpmnService.changeUserTaskCandidateGroup(
              "Review", "Power User", false);
    dynamicBpmnService.saveProcessDefinitionInfo("procDefId", infoNode);
    System.out.println("------saveProcessDefinitionInfo------=saved");

    } catch (Exception e) {
        System.out.println("------error");
        e.printStackTrace();
    }
    List<String> list = new ArrayList<String>();
    list.add("Power User");
    execution.setVariable("candidateGrp",list);
}

执行此代码时出现以下异常:

WARN  [http-bio-8080-exec-10][ProxyMessageListener:81] org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause:  com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:  Cannot add or update a child row: a foreign key constraint fails (`lportal`.`act_procdef_info`, CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`))
### The error may involve org.activiti.engine.impl.persistence.entity.ProcessDefinitionInfoEntity.insertProcessDefinitionInfo-Inline
### The error occurred while setting parameters
### SQL: insert into ACT_PROCDEF_INFO(ID_, PROC_DEF_ID_, REV_, INFO_JSON_ID_)     values(?,             ?,            1,            ?)
### Cause:  com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:  Cannot add or update a child row: a foreign key constraint fails  (`lportal`.`act_procdef_info`, CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY  (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`))
org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`lportal`.`act_procdef_info`, CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`))
### The error may involve org.activiti.engine.impl.persistence.entity.ProcessDefinitionInfoEntity.insertProcessDefinitionInfo-Inline
### The error occurred while setting parameters
### SQL: insert into ACT_PROCDEF_INFO(ID_, PROC_DEF_ID_, REV_, INFO_JSON_ID_)     values(?,             ?,            1,            ?)
### Cause:  com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`lportal`.`act_procdef_info`, CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`))

我真的无法继续。 我们将不胜感激。

谢谢。

【问题讨论】:

    标签: java liferay activiti bpmn


    【解决方案1】:

    试试这个:

    流程:

    <userTask id="review" name="Review" >
      <extensionElements>
        <activiti:taskListener event="create" class="org.activiti.MyDynamicGroupHandler" />
      </extensionElements>
    </userTask>
    

    听众:

    public class MyDynamicGroupHandler implements TaskListener {
    
      public void notify(DelegateTask delegateTask) {
    
        String assigneeGroup = 'Reviewer'
        ...
        // business logic to set correct assigneeGroup
        ...
        // set candidate group dynamically 
        delegateTask.addCandidateGroup(assigneeGroup); // 
        ...
      }
    
    }
    

    Spring 框架示例:

    myListener 在 spring bean 上下文中定义。

    <bean id="myListener" class="org.activiti.MyDynamicGroupHandler"/>
    

    流程:

    <userTask id="review" name="Review">
      <extensionElements>
        <activiti:taskListener event="create" expression="${myListener.setCandidateGroup(task, assigneeGroup)}" />
      </extensionElements>
    </userTask>
    

    听众:

    public class MyDynamicGroupHandler {
    
      public void setCandidateGroup(DelegateTask delegateTask, String assigneeGroup) {
        // set candidate group dynamically 
        delegateTask.addCandidateGroup(assigneeGroup); // 
        ...
      }
    
    }
    

    【讨论】:

    • 或者您可以使用 Spring Framework 和表达式语言将流程变量传播到侦听器执行。
    • 您好 fersmi,感谢您的意见。我已经尝试过您提供的代码 sn-p 但即使这样也不起作用。因为,即使为侦听器指定了创建事件,侦听器也会在创建任务之后执行,其中包括将候选组分配给任务。所以 addCandidateGroup 方法没有效果。
    • 如果你能分享一个spring框架+表达式语言的例子会很有帮助
    • 是的,没错。侦听器在任务创建后执行。第一次设置候选组是在侦听器中。 userTask 定义没有属性 activiti:candidateGroups。或者如果有,您可以通过 delegateTask.deleteCandidateGroup() 删除旧的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多