APScheduler тестирование на пропуск - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь протестировать пропущенные задачи с помощью APScheduler, но я не вижу запуска пропущенных задач при перезапуске APScheduler. Я настроил APScheduler следующим образом:

scheduler.py

def configure_scheduler():
    jobstores = {
        'default': SQLAlchemyJobStore(url=config('DATABASE_URL'))
    }
    sched = BlockingScheduler()
    sched.configure(jobstores=jobstores)
    sched.add_job(
        test_task,
        id='test_task', 
        'interval',  
        hours=1, 
        coalesce=True, 
        max_instances=1,
        misfire_grace_time=360, 
        replace_existing=True
    )
    return sched

if __name__ == '__main__':
    scheduler = configure_scheduler()
    scheduler.start()

Когда я запускаю планировщик в первый раз, test_task добавляется к apscheduler_jobsтаблица в моей базе данных Postgres с next_run_time одного часа с момента запуска планировщика. Затем я пытаюсь проверить пропуски зажигания путем:

  1. Изменение next_run_time в моей базе данных на текущее время
  2. Ожидание 15 секунд
  3. Запуск планировщика

Когда я следую этой процедуре, next_run_time снова устанавливается на час от текущего времени. next_run_time представляется обновленным в методе update_job хранилища заданий SQLAlchemy. Я видел один похожий вопрос , связанный с тем, что постоянные задачи хранилища заданий не запускаются после пропуска зажигания. Решение большинства других вопросов , которое я видел, заключается в добавлении аргумента misfire_grace_time к add_job. Я пробовал это в соответствии с моей конфигурацией выше, но мне не повезло с выполнением пропущенных заданий при запуске планировщика. Я что-то упустил из-за того, как взаимодействуют аргументы replace_existing и misfire_grace_time? Нужно ли вручную проверять, не было ли next_run_time каких-либо заданий в прошлом, а затем запускать эти задания перед запуском планировщика?

Я использую v3.6.1 библиотеки APScheduler.

Для дополнительного контекста, я буду развертывать планировщик на Heroku, и я пытаюсь обойти автоматический цикличный режим Heroku , который происходит по крайней мере один раз в день.

1 Ответ

0 голосов
/ 05 ноября 2019

После некоторого обсуждения в чате APScheduler Gitter с Алексом Гронхольмом (создателем APScheduler) я смог определить, что задание "перезаписывается" в моей базе данных, потому что у меня есть replace_existing=Trueв моем звонке на add_job. Это приводит к тому, что планировщик заменяет задание в хранилище заданий каждый раз, когда запускается планировщик.

Мой обходной путь

  1. Перед запуском планировщика проверьтеapscheduler_jobs таблица для существующих заданий.

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

  3. Запланируйте задания, как и раньше, используя replace_existing=True.

  4. Запустите планировщик.

...