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();