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