Добрый день! Существует ли способ в бизнес-процессе запустить подпроцесс асинхронно и продолжить выполнение БП не дожидаться выполнения подпроцесса?
(Установка признака "Выполнять следующие элементы в фоновом режиме" в начальном событии подпроцесса не помогает - основной процесс не продолжается до завершения дочернего.)
Нравится
Небеддаг Иван Владимирович,
Вы напомнили. Есть 100% вариант - вызвать через sheduler (immidiateJob вроде). Тогда не надо даже разветвлять бп. Реализация гуглится по форуму. Сам писал по этому поводу пару раз.
Ну а 1 вариант можно добить тем же элементом. Добавить его в конце так, чтобы в него входили 2 ветки, тогда он будет ждать выполнения и вашей логики и подпроцесса, а потом точка завершения основного бп.
Попробуйте с помощью этого элемента разветвить логику. И по одной ветке идите по бп, во второй запустите подпроцесс
Также для гарантированной асинхронности можно добавить в ветке перед запуском подпроцесса таймер с задержкой на 1 секунду. В таком случае будет создано задание в Quartz и в нужный момент в фоне оно запустится.
В первом случае (разветвление с помощью "И") подпроцесс запускается асинхронно, но отменяется при окончании основного процесса. В принципе, можно добавить логику отсрочки останова основного процесса, хотя возможно существует более изящное решение.
А при добавлении таймера в общем случае основной процесс всё равно дожидается окончания подпроцесса, и дальше не идет. Просто это ожидание происходит уже в фоновом потоке, а не в основном.
Данила, можно туда же в кучу смежный вопрос?
Вы не знаете, как поведет себя фоновый поток, запущенный "вручную" из задания-сценария (через Thread или BackgroundWorker) при остановке бизнес-процесса? Доработает ли он до своего логического завершения, или будет принудительно остановлен какими-то встроенными средствами?
Небеддаг Иван Владимирович,
Вы напомнили. Есть 100% вариант - вызвать через sheduler (immidiateJob вроде). Тогда не надо даже разветвлять бп. Реализация гуглится по форуму. Сам писал по этому поводу пару раз.
Ну а 1 вариант можно добить тем же элементом. Добавить его в конце так, чтобы в него входили 2 ветки, тогда он будет ждать выполнения и вашей логики и подпроцесса, а потом точка завершения основного бп.
Варфоломеев Данила,
Да, я думал о том, чтобы добить через объединяющее "И". Но у меня в основном процессе цикл, и в нем может быть около сотни итераций, и на каждой из них будет асинхронное ответвление в подпроцесс. Вот интересно, корректно ли они все соберутся друг с другом и с основной веткой процесса в финальном объединяющем "И". Запилю-ка тестовый процесс, и отпишусь как всё прошло.
Небеддаг Иван Владимирович,
Сделал тестовый процесс:
И вот результат:
То есть в конце не происходит объединения всех запущенных экземпляров подпроцесса и основного потока, процесс завершается при завершении основного потока и первого из подпроцессов, остальные отменяются.
Варфоломеев Данила,
Помог вызов через планировщик, воспользовался Вашим кодом из этого топика. Спасибо!