Такой API у Flowable. *Runtime сервисы возвращают только активные инстансы. *Historic сервисы возвращают и активные и завершённые инстансы. Для поиска завершённых экземпляров процесса можно воспользоваться bprocHistoricService.createHistoricProcessInstanceDataQuery()
. Пример использования можно посмотреть в com.haulmont.addon.bproc.web.screens.processinstance.ProcessInstanceBrowse
Если нужно отследить историю изменений ауткамов с учётом повторых заходов в одну и ту же задачу, то можно воспользоваться следующим сервисом из API Flowable:
ProcessEngines.getDefaultProcessEngine().getHistoryService()
.createHistoricDetailQuery()
.variableUpdates()
.processInstanceId(processInstanceData.getId())
.list();
Из полученного списка нужно будет отфильтровать переменные с типом OutcomesContainer
.
Один нюанс - чтобы этот запрос что-либо вернул, необходимо установить history level в full. Это можно сделать с помощью свойства приложения:
bproc.flowable.historyLevel=full
Альтернативный способ записи журнала согласования - это ловить события завершения задач и записывать значения ауткамов в какое-нибудь собственное хранилище. Это можно сделать, например, через FlowabelEventListener вроде такого:
package com.company.sample.core.listener;
import com.haulmont.addon.bproc.data.Outcome;
import com.haulmont.addon.bproc.data.OutcomesContainer;
import org.flowable.common.engine.api.delegate.event.FlowableEntityEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
public class MyTaskListener implements FlowableEventListener {
private static final Logger log = LoggerFactory.getLogger(MyTaskListener.class);
@Override
public void onEvent(FlowableEvent event) {
FlowableEntityEvent entityEvent = (FlowableEntityEvent) event;
TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity();
Map<String, Object> variables = taskEntity.getVariables();
OutcomesContainer outcomesContainer = (OutcomesContainer) variables.values().stream()
.filter(variable -> variable instanceof OutcomesContainer)
.findFirst()
.orElse(null);
if (outcomesContainer != null) {
List<Outcome> outcomes = outcomesContainer.getOutcomes();
log.info("Task {} completed with outcome {}", taskEntity.getTaskDefinitionKey(),
outcomes.get(0).getOutcomeId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
Зарегистрировать листенер нужно в модели на панели свойств процесса: