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 - , , .