BPM API
Для взаимодействия с механизмом процессов может использоваться Flowable API. Он позволяет запускать экземпляры процессов программно, выполнять задачи и производить различные запросы, например, получить список задач для пользователя или получать активные экземпляры определения процесса.
Сервисы Flowable можно получить двумя способами:
-
Использовать
ProcessEngines
в качестве отправной точки:ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); RepositoryService repositoryService = processEngine.getRepositoryService(); TaskService taskService = processEngine.getTaskService();
-
Инжектировать сервисы в бины, поскольку они зарегистрированы как бины Spring:
@Component("sample_MyCustomBean") public class MyCustomBean { @Autowired private RuntimeService runtimeService;
Дополнение предоставляет BpmTaskService
, расширяющую TaskService
Flowable. См. пример использования ниже.
Программный запуск процесса
В приведенном ниже примере процесс запускается программно из обычного редактора сущностей с помощью RuntimeService
:
@Autowired
private RuntimeService runtimeService;
@Subscribe("commitAndCloseBtn")
public void onCommitAndCloseBtnClick(Button.ClickEvent event) {
Customer customer = getEditedEntity();
String name = customer.getName();
Map<String, Object> params = new HashMap<>();
params.put("customer", customer); (1)
params.put("name", name); (2)
runtimeService.startProcessInstanceByKey( (3)
"new-customer", (4)
params); (5)
}
1 | Размещение редактируемой сущности в переменной процесса с именем customer . |
2 | Имя клиента помещается в переменную процесса типа String. |
3 | RuntimeService используется для запуска процесса. |
4 | new-customer является ключом определения процесса. |
5 | Размещение карты переменных процесса. |
Получение списка пользовательских задач
Рассмотрим примеры получения списка активных задач, назначенных аутентифицированному пользователю:
@Autowired
private TaskService taskService;
@Autowired
private CurrentAuthentication currentAuthentication;
public List<Task> getCurrentUserTasks() {
return taskService.createTaskQuery() (1)
.processDefinitionKey("approval") (2)
.taskAssignee(currentAuthentication.getUser().getUsername()) (3)
.active()
.orderByTaskCreateTime()
.desc()
.list();
}
1 | Использование TaskService для получения списка задач. |
2 | Поиск задачи процесса approval . |
3 | Поиск задач, назначенных текущему пользователю. |
Получение списка экземпляров процессов
В примере ниже показано получение списка экземпляров процесса определения approval
, относящегося к указанной сущности Order
:
@Autowired
private RuntimeService runtimeService;
public List<ProcessInstance> getActiveProcessInstances() {
return runtimeService.createProcessInstanceQuery() (1)
.processDefinitionKey("approval") (2)
.variableValueEquals("orderId", "N-1") (3)
.active()
.list();
}
1 | Использование RuntimeService для получения списка задач. |
2 | Поиск экземпляров процесса approval . |
3 | Поиск экземпляров процесса с указанной переменной процесса orderId . |
Использование BpmTaskService
BpmTaskService
расширяет TaskService
и добавляет метод для выполнения задач с выходом.
void completeTaskWithOutcome(String taskId, String outcomeId, Map<String, Object> processVariables);
Вы можете внедрить службу в свой бин Spring:
@Autowired
private BpmTaskService bpmTaskService;
или использовать класс ProcessEngines
:
BpmTaskService bpmTaskService = (BpmTaskService) ProcessEngines
.getDefaultProcessEngine()
.getTaskService();