Используя rest api (DELETE /process-instance/{id}) я завершаю активный процесс, и тут же стартую новый, по этому же БП, добавляя туда пару переменных.
это делается для того, чтобы из любого места БП переходить в завершение.
могу ли я в ExecutionListener-е как-то увидеть именно событие завершения процесса, ну и, соответственно, далее его обработать в своём коде?
Добрый день!
Не могли бы вы написать подробнее, какую задачу решаете?
DELETE /process-instance/{id} - это техническое удаление экземпляра БП.
Если суть задачи прерывать бизнес-процесс, то лучше для этого воспользоваться подпроцессом по событию (interrupting event subprocess):
Добрый день, Мстислав!
есть БП, по которому движется задача, БП довольно большой и разветвлённый.
внешняя система может постучаться в нашу, и отменить обработку заявки.
в этом случае из любого места процесса нужно попасть в автоподтверждение, которое с таймером и завершится через 3 часа.
в случае с завершением процесса, и с перезапуском его, используя $CAMUNDA_ENGINE_REST/message, мы вполне переходим в нужное место БП - из любой позиции в автоподтверждение. но при этом мы не можем обрабатывать событие так же, как обрабатываем обычные переходы.
хоть как-то обрабатывать событие всенепременнейше нужно, потому что у нашего приложения в бд тоже лежат процессы и их ид, и статус их.
т.е. ввиду того, что событие не обрабатывается, возникает несогласованность между бд камунды, где закрывшегося процесса, конечно же, нет, и бд приложения, где процесс всё еще значится как активный.
можно, конечно, просто закрывать в бд приложения этот процесс, выставляя ему соответствующий статус. но хотелось бы, если есть возможность, обрабатывать событие закрытия процесса так же, как и другие.
на англоязычном форуме камунды указано, что это возможно, и нужно использовать ExecutionListener. однако я не вижу там никаких событий закрытия, которые можно обработать.
Роман, неужели не подойдет вот такой вариант?
Мне кажется, ваша задача может быть решена без применения листнеров
- Ниже основного потока исполнения помещаете непрерывающий подпроцесс по событию
- Старт подпроцесса - сообщение “Отзови заявку”
- А. Если отмена, не трогаем основной поток процесса
- Б. Если подтверждение или таймаут - выполняем (опционально) какие-то регламентные вещи и терминируем основной процесс.
У нас по такой схеме реализовывался отзыв документа в СЭД.
Поддержу. Получение сигнала о завершении процессов с помощью листенера все же хотелось бы иметь. Это может понадобиться для технических задач, таких как мониторинг, аудит, телеметрия. Изменение одной-двух bpmn диаграмм не вариант, особенно если этих диаграмм много. У нас, например, нельзя просто так изменить диаграмму , за которую отвечает другая группа на стороне заказчика. Внести в диаграмму какие-то дополнительные технические аспекты - это уже будет крайняя мера, если нет возможности решить через приложение. Так что вопрос про листенер остается актуальным.
В таком случае проще всего воспользоваться Spring Event Bridge:
@EventListener
public void onHistoryEvent(HistoryEvent historyEvent) {
if (historyEvent.getEventType().equals(endEventType)) {
// вызвать нужный метод
}
}