【问题标题】:Celery Storing unrecoverable task failures for later resubmissionCelery 存储不可恢复的任务失败以供以后重新提交
【发布时间】:2012-07-22 13:45:31
【问题描述】:

我正在使用 djkombu 传输进行本地开发,但我可能会在生产中使用 amqp (rabbit)。

我希望能够迭代特定类型的失败并重新提交。这可能是在服务器上出现故障或由数据的某些新变化触发的某些边缘情况错误的情况下。

因此,在修复某些错误或第三方网站备份后,我最多可以在 12 小时后重新提交作业。

我的问题是:有没有办法通过结果后端访问旧的失败作业并使用相同的参数等重新提交它们?

【问题讨论】:

    标签: django celery django-celery


    【解决方案1】:

    您可能可以使用以下方式访问旧作业:

    CELERY_RESULT_BACKEND = "database"
    

    在你的代码中:

    from djcelery.models import TaskMeta
    task = TaskMeta.objects.filter(task_id='af3185c9-4174-4bca-0101-860ce6621234')[0]
    

    但我不确定您是否可以找到启动任务的参数...也许与 TaskState 相关...

    我从来没有这样用过。但是您可能想考虑task.retry 功能? 来自 celery 文档的示例:

    @task()
    def task(*args):
        try:
            some_work()
        except SomeException, exc:
            # Retry in 24 hours.
            raise task.retry(*args, countdown=60 * 60 * 24, exc=exc)
    

    【讨论】:

    • 不幸的是,当我不再引用特定任务时 .retry 没有用,因为 args/kwargs 未存储在失败的任务中。我必须有自己的模型来存储这些信息。
    • 我不确定。你是什​​么意思你没有提到具体的任务?如果任务失败 - 然后重试将在指定的倒计时期后使用相同的 args/kwargs 启动它。否则,您需要保留每个任务的参数,并手动重新启动它..
    • > 否则,您需要保留每个任务的参数,并手动重新启动它。是的,这是我需要做的,因为服务器可能同时重新启动等等。编辑: 引号没有像记录的那样工作,呵呵。
    【解决方案2】:

    来自 IRC

    dpn`: task args 和 kwargs 不与结果一起存储

    dpn`:但您可以创建自己的模型并将其存储在那里 (例如使用 task_sent 信号)

    发送任务时我们不存储任何东西,只发送一个 信息。但是自己做很容易

    这是我所期待的,但希望避免。

    至少我现在有了答案:)

    【讨论】:

      猜你喜欢
      • 2015-06-26
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2020-08-11
      • 2023-03-27
      相关资源
      最近更新 更多