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_base.png
single_base.png [ 29.43 КБ | Просмотров: 4497 ]

Пример использования:
Вложение:
single_test.png
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/