Вопрос

Асинхронный запуск подпроцесса

Добрый день! Существует ли способ в бизнес-процессе запустить подпроцесс асинхронно и продолжить выполнение БП не дожидаться выполнения подпроцесса?

(Установка признака "Выполнять следующие элементы в фоновом режиме" в начальном событии подпроцесса не помогает - основной процесс не продолжается до завершения дочернего.)

Нравится

8 комментариев
Лучший ответ

Небеддаг Иван Владимирович,

Вы напомнили. Есть 100% вариант - вызвать через sheduler (immidiateJob вроде). Тогда не надо даже разветвлять бп. Реализация гуглится по форуму. Сам писал по этому поводу пару раз. 

Ну а 1 вариант можно добить тем же элементом. Добавить его в конце так, чтобы в него входили 2 ветки, тогда он будет ждать выполнения и вашей логики и подпроцесса, а потом точка завершения основного бп.

Попробуйте с помощью этого элемента разветвить логику. И по одной ветке идите по бп, во второй запустите подпроцесс

Также для гарантированной асинхронности можно добавить в ветке перед запуском подпроцесса таймер с задержкой на 1 секунду. В таком случае будет создано задание в Quartz и в нужный момент в фоне оно запустится.

В первом случае (разветвление с помощью "И") подпроцесс запускается асинхронно, но отменяется при окончании основного процесса. В принципе, можно добавить логику отсрочки останова основного процесса, хотя возможно существует более изящное решение.

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

Данила, можно туда же в кучу смежный вопрос?

Вы не знаете, как поведет себя фоновый поток, запущенный "вручную" из задания-сценария (через Thread или BackgroundWorker) при остановке бизнес-процесса? Доработает ли он до своего логического завершения, или будет принудительно остановлен какими-то встроенными средствами?

Небеддаг Иван Владимирович,

Вы напомнили. Есть 100% вариант - вызвать через sheduler (immidiateJob вроде). Тогда не надо даже разветвлять бп. Реализация гуглится по форуму. Сам писал по этому поводу пару раз. 

Ну а 1 вариант можно добить тем же элементом. Добавить его в конце так, чтобы в него входили 2 ветки, тогда он будет ждать выполнения и вашей логики и подпроцесса, а потом точка завершения основного бп.

Варфоломеев Данила,

Да, я думал о том, чтобы добить через объединяющее "И". Но у меня в основном процессе цикл, и в нем может быть около сотни итераций, и на каждой из них будет асинхронное ответвление в подпроцесс. Вот интересно, корректно ли они все соберутся друг с другом и с основной веткой процесса в финальном объединяющем "И". Запилю-ка тестовый процесс, и отпишусь как всё прошло.

Небеддаг Иван Владимирович,

Сделал тестовый процесс:

И вот результат:

То есть в конце не происходит объединения всех запущенных экземпляров подпроцесса и основного потока, процесс завершается при завершении основного потока и первого из подпроцессов, остальные отменяются.

Варфоломеев Данила,

Помог вызов через планировщик, воспользовался Вашим кодом из этого топика. Спасибо!

Показать все комментарии