Есть сервисная задача, необходимо по результатам ее выполнения выделить 2 ветки куда дальше двинется процесс, каким образом это можно реализовать? (в формах ауткомы есть, а в сервисных не нашел)
подобное ветвление, только не пользовательская задача, а сервисная
Добрый день,
Конечно же такой механизм есть, в принципе на UserTask + Service Task + TimerEvent + Error Event можно написать любой бизнес процесс любой сложности прибегая как раз таки к ServiceTask в сложных случаях.
Концепция
Самый простой вариант описан тут: BPMN 2.0 Constructs · Flowable Open Source Documentation
- Вам нужна либо SpringBean либо JavaDelegate либо Delegate (нужно вызвать Java делегат).
- Внутри делегата мы вызываем нашу бизнес логику, результат выполнения через Flowable API (RuntimeService SpringBean) складываем в процесс
- В процессе на sequenceFlow(ветки выходящие из Gate) мы ставим expression условие, по которому мы входим в ветку
- получили то самое ветвление
Пример
1) Создаем SpringBean:
У нас будет готовый спринг компонент(сервис) который будет выполнять бизнес логипу и складывать результат в переменную процесса, которая понадобиться в самом процессе, чтобы понять, куда далее идти
@Component("project_YourSpringBeanService")
public abstract class YourSpringBeanService implements JavaDelegate {
private final SystemAuthenticator systemAuthenticator;
private final RuntimeService runtimeService;
private final DataManager dataManager;
protected AbstractStep(...) {
... // Spring Constructor DI, nothing interesting
}
protected void runBusinessLogics(DelegateExecution execution) {
...// Your business logics here
persistVariable("resultCheck", "true");
}
@Override
public void execute(DelegateExecution execution) {
// Running as system for escaping errors for unauthorized with data exception
systemAuthenticator.runWithSystem(() -> runBusinessLogics(execution));
}
protected void persistVariable(DelegateExecution execution, String variableName, Object value) {
runtimeService.setVariable(execution.getId(), variableName, value);
}
protected void persistVariables(DelegateExecution execution, Map<String, Object> variables) {
runtimeService.setVariables(execution.getId(), variables);
}
@SuppressWarnings("unchecked")
protected <T> T getVariable(DelegateExecution execution, String variableName) {
return (T) runtimeService.getVariable(execution.getId(), variableName);
}
}
2) Пропишем сервис таску в бизнес процессе и ее sequenceFlow
<serviceTask id="SERVICE_TASK_RUN" name="Запуск сервис таски" flowable:expression="${project_YourSpringBeanService.execute(execution)}" jmix:taskType="springBean" jmix:beanName="project_YourSpringBeanService">
<extensionElements>
<jmix:springBean beanName="project_YourSpringBeanService" methodName="execute">
<jmix:methodParam name="execution" type="org.flowable.engine.delegate.DelegateExecution" isVariable="true">execution</jmix:methodParam>
тут мы прокидываем переменную которая дает данные о процессе
</jmix:springBean>
</extensionElements>
<outgoing>FLOW_INTO_GATE</outgoing>
</serviceTask>
- Далее эта сервис таска выходит в нужный Gate, например, ExcludingGate
- Из гейта выходят подобные SequenceFlow, который имеют expression условия:
<sequenceFlow id="POSITIVE_FLOW_FROM_GATE" name="положительный выход из гейта">
<extensionElements>
<jmix:conditionDetails conditionSource="expression"/>
</extensionElements>
<conditionExpression xsi:type="tFormalExpression">${resultCheck == 'true'}</conditionExpression>
</sequenceFlow>
Для негативного флоу надо сделать тоже самое но с условием resultCheck == 'false'
1 симпатия