【问题标题】:Revoke a queued task if the related object does not exist如果相关对象不存在,则撤销排队任务
【发布时间】:2020-12-03 08:47:01
【问题描述】:

我正在尝试删除在创建对象时触发的排队任务(使用 Celery)。 如果要在事件前 5 分钟触发任务并且对象已被删除,则队列中的消息将保留。

task.py

@app.task
def send_notification(abc):
    # do some stuff with abc
    # return something

models.py

class ABC(models.Model):
    description = models.TextField()

views.py

def abc(request):
    # create the ABC object
    send_after=timezone.now() + timedelta(minutes=5)
    send_notification.apply_async(eta=send_after)
    # return something

因此,当对象 ABC 在创建后立即被删除时,相关的排队消息也应该被撤销。

关于如何处理这个问题的任何想法?

【问题讨论】:

    标签: python django rabbitmq celery


    【解决方案1】:

    我通过将对象 ID 传递给任务而不是对象来解决此问题,因此在任务中增加了一行:

    @app.task
    def send_notification(abc_id):
        try:
            abc_obj = ABC.objects.get(id=abc_id)
        except ObjectDoesnotExist:
            return
    
        # do some stuff with abc
        # return something
    

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 1970-01-01
      • 2022-09-25
      • 2023-03-07
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多