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 КБ | Просмотров: 4497 ] |
Автор: | 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/ |