Acerca del uso de Activiti BPM en el desarrollo de procesos comerciales

¡Hola a todos! Mencionamos anteriormente que la plataforma Unidata está activa con los procesos comerciales y admite la notación BPMN en el corazón de su diseño. Para el desarrollo de BP, utilizamos el motor Activiti BPMN de código abierto basado en java. Entre los productos de código abierto disponibles para el diseño de procesos comerciales, elegimos Activiti por 2 razones:





  • Ya teníamos experiencia con este producto.





  • Existe una conveniente licencia de Apache para el desarrollo comercial.





En este artículo, compartiremos nuestra propia experiencia en el uso de Activiti en el desarrollo de procesos comerciales reales para un cliente.





El primer paso para desarrollar un proceso empresarial es formar un diagrama de proceso empresarial. Por ejemplo, el complemento Activiti para Eclipse le permite diseñar visualmente un proceso comercial en notación BPMN 2.0. El editor visual tiene todos los componentes necesarios para ello: tareas de varios tipos, subprocesos, pasarelas, disparadores, scripts y otros. Basta con arrastrar un elemento BPM de la lista al diagrama y luego conectar todos los elementos con “flechas”, ya que en la notación BPMN se denota “Sequence Flow”. El diagrama del proceso comercial mediante Activiti está escrito en un archivo xml de configuración especial, que puede editarse más. A continuación, se muestra un ejemplo de un proceso empresarial sencillo.





, BPMN, :





  • UserTask – , . -





  • ServiceTask , .





  • MailTask





  • (Sequence Flow) . (“”)









  • . , , SLA .





, , , .  Activiti, - Unidata. , java-, WorkflowProcessSupport, . WorkflowProcessSupport Activiti Unidata.  .





@Override
public WorkflowProcessStartState processStart(StartProcessRequestContext ctx) {
    WorkflowProcessStartState state = new WorkflowProcessStartState();
    state.setAllow(true);
 
    Map<String, Object> processVariables = state.getAdditionalProcessVariables();
    if (processVariables == null) {
        processVariables = new HashMap<>();
    }
 
    processVariables.put("validFrom", ctx.getValidFrom());
    processVariables.put("validTo", ctx.getValidTo());
 
 
    state.setAdditionalProcessVariables(processVariables);
    return state;
}
      
      



processStart (userTask) . task_id, .





@Override
public WorkflowProcessAfterStartState afterProcessStart(String processInstanceId, String
        processDefinitionId, Map<String, Object> variables) {
 
    WorkflowProcessAfterStartState state = new WorkflowProcessAfterStartState();
    Map<String, Object> processVariables = state.getAdditionalProcessVariables();
    if (processVariables == null) {
        processVariables = new HashMap<>();
    }
 
    processVariables.put("processId", processInstanceId);
 
 
    String initiatorEmail = (String) variables.get("initiatorEmail");
    if (initiatorEmail == null || !initiatorEmail.contains("@"))
        processVariables.put("initiatorEmail", "testmail@testmail.com");
 
    state.setAdditionalProcessVariables(processVariables);
 
    return state;
}
      
      



afterProcessStart . processStart tasl_id, .





@Override
public WorkflowTaskCompleteState complete(String taskDefinitionId, Map<String, Object> variables,
                                          String actionCode) {
    WorkflowTaskCompleteState state = new WorkflowTaskCompleteState(true, "FINISHED".equals(actionCode) ? "Approve task." : "Decline task.");
    Map<String, Object> additionalProcessVariables = state.getAdditionalProcessVariables();
    if (additionalProcessVariables == null) {
        additionalProcessVariables = new HashMap<>();
    }
    Map<String, Object> additionalTaskVariables = state.getAdditionalProcessVariables();
 
     if (taskDefinitionId.equals("expertTask")) {
        if (!WorkflowUtils.curatorsIsAvailable("role_name")) {
            throw new WorkflowException(USER_NOT_AVALIBLE, ExceptionId.EX_WF_CANNOT_COMPLETE_TASK_COMPLETION_ERROR);
        }
    }
 
    state.setAdditionalProcessVariables(additionalProcessVariables);
    state.setAdditionalTaskVariables(additionalTaskVariables);
    return state;
}
      
      



complete , .





@Override
public WorkflowProcessEndState processEnd(String processDefinitionId, Map<String, Object> variables) {
 
    String selectorValue = (String) variables.get("finishTaskSelector");
    WorkflowProcessEndState state = new WorkflowProcessEndState();
    if (selectorValue != null && selectorValue.equals("complete")) {
        state.setComplete(true);
    } else {
        state.setComplete(false);
    }
    LOGGER.info(String.format("End process %s with action %s", processDefinitionId, selectorValue));
    return state;
}
      
      



processEnd -. - , , , .





, , . Activiti, Activiti. , Form properties UserTask.





descriptionCode, , taskSelector, . . - , . , .





, – . UserTask, Main config Assignee Candidate group. Assignee, . Candidate group, , , .





, - . . -. , , . , Activiti , . Activiti Listener’, Java , .





- , Activiti , – . , -, .  Activiti , . . - , Activiti Activiti SQL .   , , Activiti elasticsearch. .





, Activiti BPM - , ,   .








All Articles