forum.bitel.ru http://forum.bitel.ru/ |
|
Single Instance в планировщике http://forum.bitel.ru/viewtopic.php?f=22&t=12827 |
Страница 1 из 1 |
Автор: | Cromeshnic [ 13 мар 2018, 11:58 ] |
Заголовок сообщения: | Single Instance в планировщике |
Добрый день. Недавно столкнулся с ситуацией, когда одна задача в планировщике повисла, затем через полчаса запустилась её копия и тоже повисла, и так далее, пока не кончился scheduler.periodic.thread.count. После этого вообще все задачи перестали запускаться. Вот я и думаю - а зачем вообще планировщик пытается запустить второй раз задачу, которая у него ещё с прошлого раза не отработала? Может быть есть смысл ограничить это? Хотя бы опциональным флагом в конфиге. Вообще когда может потребоваться такая логика, что 2 одинаковые задачи могут работать одновременно? По-моему, для пересчётов и т.п., наоборот, нельзя запускать одновременно. В моём случае задачей был глобальный скрипт поведения по таймеру, который завис на выборке из внешней базы. Если бы шедулер на запускал его многократно, то завис бы только он, а остальные задачи продолжили бы исполняться. |
Автор: | Cromeshnic [ 13 мар 2018, 12:01 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
Можно конечно написать свой класс SingleExecGlobalScriptBase extends GlobalScriptBase, куда добавить менеджмент блокировок и проверку наличия блокировки перед выполнением (по имени класса, например). Но не хочется изобретать велосипед. Мне кажется, это должно быть в самом шедулере. |
Автор: | dimOn [ 13 мар 2018, 12:39 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
Там есть уже такая возможность, и ограничение параллельного запуска и просто схлопывание одинаковых задач если они сейчас в очереди. См. например в синхронизаторе церберкрипта итд. Просто не везде реализовано, не во всех тасках. Цитата: Вообще когда может потребоваться такая логика, что 2 одинаковые задачи могут работать одновременно? Одновременно вообще без разницы, можно все по очереди запускать, просто это неэффективно же. Зачем мариновать в очереди если можно рядом запустить. Но потеряться они не должны, даже если с виду одинаковые. Например, запустилась синхронизация по двум картам после редактирования их оператором. Но эта система учитывает это, для каких случаев одинаковые а для каких нет. |
Автор: | Cromeshnic [ 14 мар 2018, 09:23 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
dimOn писал(а): Там есть уже такая возможность, и ограничение параллельного запуска и просто схлопывание одинаковых задач если они сейчас в очереди. См. например в синхронизаторе церберкрипта итд. Просто не везде реализовано, не во всех тасках. ru.bitel.bgbilling.modules.cerbercrypt.server.task.Synchronizer ? Не нашёл по коду в 7.1 ничего похожего там. |
Автор: | dimOn [ 14 мар 2018, 11:10 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
код конечно в ядре, а там только задаются айдишники |
Автор: | dimOn [ 14 мар 2018, 11:19 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
я наврал, это в RunTask, а не самих тасках Код: @Override
public String getUniqueKeyQueue() { // получаем список номеров карт, this.usercards всегда не null у нас List<Long> oneusercardsnumber = this.usercards.stream().map(uc->uc.getNumber()).collect(Collectors.toList()); // одинаковыми считаются задачи синхронизации одинаковых карт (в "тяжёлых" полной синхронизации не бывает, а только в по расписанию) return "cerbercrypt-"+mid+"-synchronizer-"+Utils.toString(oneusercardsnumber); } @Override public String getUniqueKeyParallel() { // задачи синхронизации одного модуля вообще пусть друг друга ждут в очереди и синхронизуют по очереди return "cerbercrypt-"+mid+"-synchronizer"; } |
Автор: | Cromeshnic [ 14 мар 2018, 11:55 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
Ага, глянул: по getUniqueKeyQueue несколько одинаковых задач схлапываются в очереди в одну перед запуском, а по getUniqueKeyParallel будут по-очереди выполняться. |
Автор: | Cromeshnic [ 14 мар 2018, 12:02 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
А для TaskBase не думали такую же логику сделать? Например, можно из конфига таски брать режим параллельного выполнения: 0 - всегда, 1 - в очередь, 2 - не выполнять, 3 - не выполнять и слать аларм "задача всё ещё работает". Для глобальных скриптов тогда пользователь сам сможет прописать, а стандартные задачи планровщика задать жестко. Например, помню, что были проблемы в Dialup, если 2 раза ткнуть пересчёт сессий параллельно - трафики двоились. |
Автор: | dimOn [ 14 мар 2018, 12:27 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
Ну в смысле те что по расписанию вроде бы нелогично так ограничивать... То есть по идее это ошибка должна быть. А этот механизм действует на всякие так или иначе добавляемые через действия оператора - запуски перерасчётов, обновления карт итд. Хотя я уже точно не помню почему сразу для TaskBase не получилось это сделать, надо подумать, но всяко туда бы сделали если получилось. |
Автор: | Cromeshnic [ 22 мар 2018, 09:50 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
Сделал кароч. Базовый скрипт: Вложение: Пример использования: Вложение: single_test.png [ 5.91 КБ | Просмотров: 5855 ] |
Автор: | dimOn [ 22 мар 2018, 11:58 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
а если запустятся два калькулятора разных экземпляров модуля? а... или я не понял - это для какого случая глоб скрипт, ручного запуска? |
Автор: | Cromeshnic [ 22 мар 2018, 12:11 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
Ну это именно для глобальных скриптов, а им, как мы знаем, параметры нельзя передать из конфига задачи планировщика ![]() Поэтому не получится использовать один и тот же класс глобального скрипта в двух задачах планировщика с разными настройками (mid например). Поэтому пишутся разные классы. Но вообще можно заморочиться и локи объединить по группам. Чтобы несколько разных скриптов могли лочить друг друга. Через аннотации, например, передавать их. Заодно изучу, как свои аннотации пилить ![]() Можно ещё разные типы локов сделать: выдавать ошибку, ждать (с таймаутом/без), молча завершаться. |
Автор: | skyb [ 31 мар 2018, 02:11 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
dimOn писал(а): Ну в смысле те что по расписанию вроде бы нелогично так ограничивать... То есть по идее это ошибка должна быть. А этот механизм действует на всякие так или иначе добавляемые через действия оператора - запуски перерасчётов, обновления карт итд. Хотя я уже точно не помню почему сразу для TaskBase не получилось это сделать, надо подумать, но всяко туда бы сделали если получилось. да диспач в пример, я правда не знаю поправили это или нет, когда он вешал весь планировщик |
Автор: | dimOn [ 01 апр 2018, 11:29 ] |
Заголовок сообщения: | Re: Single Instance в планировщике |
это про что речь? |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |