【问题标题】:Jobs are not being stored in the database after add_job() has been called调用 add_job() 后,作业未存储在数据库中
【发布时间】:2019-08-24 20:11:19
【问题描述】:

我正在尝试使用 Flask-APScheduler 来运行一些延迟的作业,在设置和运行应用程序后,它成功在 Postgres 数据库中创建作业表,但在 add_job() 之后没有保存作业已成功调用。

config.py (尝试使用默认的表模式和表名,但仍然没有存储作业)

SCHEDULER_TIMEZONE = utc
SCHEDULER_API_ENABLED = False

SCHEDULER_JOBSTORES = {
    'default': SQLAlchemyJobStore(
        url=SQLALCHEMY_DATABASE_URI,
        tableschema=DB_SCHEMA,
        tablename='jobs'
    )
}

SCHEDULER_EXECUTORS = {
    'default': ThreadPoolExecutor(20),
    'processpool': ProcessPoolExecutor(5)
}

SCHEDULER_JOB_DEFAULTS = {
    'coalesce': False,
    'max_instances': 3
}

添加作业代码 (显示的日志消息和 except 正文都被忽略了。还尝试隐式设置 jobstore='default' 但仍然是同样的问题)

date = datetime.strptime(date_string, DATETIME_FORMAT)

try:
    app.logger.info('adding job')
    scheduler.add_job(
        job_id,
        publish_post,
        name=job_name,
        trigger='date',
        next_run_time=date,
        kwargs={
            'channel': channel,
            'post': post
        }
    )
    app.logger.info('job added')

except Exception as e:
    app.logger.error(e)
    sentry.captureException()
    return {
        'status': 'FAILED',
        'message': 'Can not add job ({})'.format(job_name)
    }

job.py (要运行的测试作业)

def publish_post(channel, post):
    app.logger.info('{}: {}'.format(channel, post.text))

UPD:

在启动调试模式时,我收到以下消息:

gunicorn_scheduler_1    | 2019-04-04 07:07:21 - INFO     - Scheduler started
gunicorn_scheduler_1    | 2019-04-04 07:07:21 - DEBUG    - No jobs; waiting until a job is added

但在adding jobjob added 之间调用add_job() 之后,我收到了来自APScheduler 的附加消息:

2019-04-04 07:09:46 - INFO     - Adding job tentatively -- it will be properly scheduled when the scheduler starts

但第一条消息告诉调度程序已经启动。

【问题讨论】:

  • APScheduler 日志是什么?
  • @TomášLinhart 除了我的adding jobjob added 一个接一个地记录之外,没有其他日志。这两个是唯一的输出。
  • 尝试将日志级别设置为DEBUG。如何做到这一点完全取决于您的 Flask 日志记录设置以及您运行 Flask 应用程序的方式。
  • @TomášLinhart 你是对的。它增加了一行输出Adding job tentatively -- it will be properly scheduled when the scheduler starts,我在阅读源代码时看到了这条消息。但是我在运行应用程序时启动调度程序,并作为证据创建数据库表,并且此操作也在调度程序启动时运行。
  • 仍然缺少一些重要的信息。您用来实例化 APScheduler 的代码是什么?你如何启动 Flask 应用程序?据我所知,我猜你使用 gunicorn 和 docker compose。但是 gunicorn 的命令行到底是什么?我会说它源于使用多个 gunicorn 工作人员,但只实例化(和启动)调度程序一次,但无法真正分辨。无论如何,请注意this FAQ(以及之后的那个)。

标签: python postgresql apscheduler


【解决方案1】:

我遇到了同样的问题,我用 1 行设置数据库解决了 示例:

scheduler = BlockingScheduler(jobstores=jobstores (You dont need this param), executors=executors, job_defaults=job_defaults, timezone='Etc/GMT+3')

scheduler = BlockingScheduler(executors=executors, job_defaults=job_defaults, timezone='Etc/GMT+3')

-- 使用这一行来设置你的数据库

scheduler.add_jobstore('sqlalchemy', url='sqlite:///jobs.sqlite')

你的工作已经完成,开始保存在数据库中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2021-07-02
    • 2011-11-14
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多