# Получение события при завершении процесса

**URL:** <https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141>\
**Category:** Camunda 7\
**Created:** [08.Май.2022 13:06:53 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141 "2022-05-08T13:06:53Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![namor](https://forum.reunico.com/letter_avatar_proxy/v4/letter/n/ad7895/32.png) [@namor](https://forum.reunico.com/u/namor)\
**Post date:** [08.Май.2022 13:06:53 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141/1 "2022-05-08T13:06:53Z")

</div>

Используя rest api (DELETE /process-instance/{id}) я завершаю активный процесс, и тут же стартую новый, по этому же БП, добавляя туда пару переменных.  
это делается для того, чтобы из любого места БП переходить в завершение.  
могу ли я в ExecutionListener-е как-то увидеть именно событие завершения процесса, ну и, соответственно, далее его обработать в своём коде?

---

<div class="post-metadata">

**Author:** ![Mstislav](https://forum.reunico.com/user_avatar/forum.reunico.com/mstislav/32/102_2.png) [@Mstislav](https://forum.reunico.com/u/Mstislav)\
**Post date:** [10.Май.2022 07:59:31 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141/2 "2022-05-10T07:59:31Z")

</div>

Добрый день!

Не могли бы вы написать подробнее, какую задачу решаете?

DELETE /process-instance/{id} - это техническое удаление экземпляра БП.

Если суть задачи прерывать бизнес-процесс, то лучше для этого воспользоваться подпроцессом по событию (interrupting event subprocess):

[https://docs.camunda.org/manual/7.16/reference/bpmn20/subprocesses/event-subprocess/](https://docs.camunda.org/manual/7.16/reference/bpmn20/subprocesses/event-subprocess/)

---

<div class="post-metadata">

**Author:** ![namor](https://forum.reunico.com/letter_avatar_proxy/v4/letter/n/ad7895/32.png) [@namor](https://forum.reunico.com/u/namor)\
**Post date:** [10.Май.2022 11:49:58 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141/3 "2022-05-10T11:49:58Z")

</div>

Добрый день, Мстислав!

есть БП, по которому движется задача, БП довольно большой и разветвлённый.

внешняя система может постучаться в нашу, и отменить обработку заявки.  
в этом случае из любого места процесса нужно попасть в автоподтверждение, которое с таймером и завершится через 3 часа.  
в случае с завершением процесса, и с перезапуском его, используя $CAMUNDA\_ENGINE\_REST/message, мы вполне переходим в нужное место БП - из любой позиции в автоподтверждение. но при этом мы не можем обрабатывать событие так же, как обрабатываем обычные переходы.  
хоть как-то обрабатывать событие всенепременнейше нужно, потому что у нашего приложения в бд тоже лежат процессы и их ид, и статус их.

т.е. ввиду того, что событие не обрабатывается, возникает несогласованность между бд камунды, где закрывшегося процесса, конечно же, нет, и бд приложения, где процесс всё еще значится как активный.  
можно, конечно, просто закрывать в бд приложения этот процесс, выставляя ему соответствующий статус. но хотелось бы, если есть возможность, обрабатывать событие закрытия процесса так же, как и другие.  
на англоязычном форуме камунды указано, что это возможно, и нужно использовать ExecutionListener. однако я не вижу там никаких событий закрытия, которые можно обработать.

---

<div class="post-metadata">

**Author:** ![namor](https://forum.reunico.com/letter_avatar_proxy/v4/letter/n/ad7895/32.png) [@namor](https://forum.reunico.com/u/namor)\
**Post date:** [10.Май.2022 12:04:28 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141/4 "2022-05-10T12:04:28Z")

</div>

![bp](https://forum.reunico.com/uploads/default/original/1X/6d7c456eca1d847b52ccdaa28d87d9f848bd3980.png)

---

<div class="post-metadata">

**Author:** ![Mstislav](https://forum.reunico.com/user_avatar/forum.reunico.com/mstislav/32/102_2.png) [@Mstislav](https://forum.reunico.com/u/Mstislav)\
**Post date:** [11.Май.2022 10:33:56 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141/5 "2022-05-11T10:33:56Z")

</div>

Роман, неужели не подойдет вот такой вариант?

 ![image](https://forum.reunico.com/uploads/default/original/1X/529b90b3ac1cc2470540d44862c33a922896e35d.png)  
Мне кажется, ваша задача может быть решена без применения листнеров 🙂

1. Ниже основного потока исполнения помещаете непрерывающий подпроцесс по событию
2. Старт подпроцесса - сообщение “Отзови заявку”
3. А. Если отмена, не трогаем основной поток процесса
4. Б. Если подтверждение или таймаут - выполняем (опционально) какие-то регламентные вещи и терминируем основной процесс.

У нас по такой схеме реализовывался отзыв документа в СЭД.

---

<div class="post-metadata">

**Author:** ![German](https://forum.reunico.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@German](https://forum.reunico.com/u/German)\
**Post date:** [29.Август.2024 08:47:37 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141/6 "2024-08-29T08:47:37Z")

</div>

Поддержу. Получение сигнала о завершении процессов с помощью листенера все же хотелось бы иметь. Это может понадобиться для технических задач, таких как мониторинг, аудит, телеметрия. Изменение одной-двух bpmn диаграмм не вариант, особенно если этих диаграмм много. У нас, например, нельзя просто так изменить диаграмму , за которую отвечает другая группа на стороне заказчика. Внести в диаграмму какие-то дополнительные технические аспекты - это уже будет крайняя мера, если нет возможности решить через приложение. Так что вопрос про листенер остается актуальным.

---

<div class="post-metadata">

**Author:** ![Mstislav](https://forum.reunico.com/user_avatar/forum.reunico.com/mstislav/32/102_2.png) [@Mstislav](https://forum.reunico.com/u/Mstislav)\
**Post date:** [29.Август.2024 12:09:00 UTC](https://forum.reunico.com/t/poluchenie-sobytiya-pri-zavershenii-proczessa/141/7 "2024-08-29T12:09:00Z")

</div>

В таком случае проще всего воспользоваться Spring Event Bridge:

```auto
    @EventListener
    public void onHistoryEvent(HistoryEvent historyEvent) {
        if (historyEvent.getEventType().equals(endEventType)) {
           // вызвать нужный метод
        }
    }

```
