À propos de l'utilisation d'Activiti BPM dans le développement de processus métier

Bonjour à tous! Nous avons mentionné précédemment que la plate-forme Unidata est active avec les processus métier et prend en charge la notation BPMN au cœur de leur conception. Pour le développement de BP, nous utilisons le moteur open source Activiti BPMN basé sur java. Parmi les produits open source disponibles pour la conception de processus métier, nous avons choisi Activiti pour 2 raisons :





  • Nous avions dĂ©jĂ  une expĂ©rience avec ce produit





  • Il existe une licence Apache pratique pour le dĂ©veloppement commercial





Dans cet article, nous partagerons notre propre expérience d'utilisation d'Activiti dans le développement de processus commerciaux réels pour un client.





La première Ă©tape du dĂ©veloppement d'un processus mĂ©tier consiste Ă  former un diagramme de processus mĂ©tier. Par exemple, le plug-in Activiti pour Eclipse vous permet de concevoir visuellement un processus mĂ©tier en notation BPMN 2.0. L'Ă©diteur visuel dispose de tous les composants nĂ©cessaires pour cela : tâches de diffĂ©rents types, sous-processus, passerelles, dĂ©clencheurs, scripts et autres. Il suffit de faire glisser un Ă©lĂ©ment BPM de la liste sur le diagramme, puis de connecter tous les Ă©lĂ©ments avec des « flèches Â», comme dans la notation BPMN, il est notĂ© « Flux de sĂ©quence Â». Le diagramme du processus commercial au moyen d'Activiti est Ă©crit dans un fichier xml de configuration spĂ©cial, qui peut ĂŞtre modifiĂ© ultĂ©rieurement. Vous trouverez ci-dessous un exemple de processus mĂ©tier simple.





, 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