【问题标题】:Amazon SQS and celery events (not JSON serializable)Amazon SQS 和 celery 事件(不是 JSON 可序列化的)
【发布时间】:2013-01-10 00:57:39
【问题描述】:

我今天正在研究将 Amazon SQS 作为在 EC2 实例上安装我自己的 RabbitMQ 的替代方法。

我已按照here 所述的文档进行操作

在一段中它说:

SQS 还不支持事件,因此不能与 celery 一起使用 事件、celerymon 或 Django Admin 监视器。

我有点困惑events 在这里的含义。例如在下面的场景中,我每分钟都有一个周期性任务,我异步调用sendEmail.delay(event)

例如

@celery.task(name='tasks.check_for_events')
@periodic_task(run_every=datetime.timedelta(minutes=1))  
def check_for_events():        
    now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
    events = Event.objects.filter(reminder_date_time__range=(now - datetime.timedelta(minutes=5), now))
    for event in events:        
        sendEmail.delay(event)

@celery.task(name='tasks.sendEmail')
def sendEmail(event):
    event.sendMail()

使用 Amazon SQS 运行它时,我收到以下错误消息:

tasks.check_for_events[7623fb2e-725d-4bb1-b09e-4eee24280dc6] 提出 异常:TypeError(' 是 不是 JSON 可序列化的',)

那么是文档中指出的 SQS 的限制,还是我做错了什么? 非常感谢您的建议,

【问题讨论】:

    标签: django celery django-celery amazon-sqs


    【解决方案1】:

    对于返回此帖子的人, 当 celery 运行时配置中定义的序列化程序无法处理传递给 celery 任务的对象时,就会发生这种情况。

    例如:如果配置将 JSON 作为必需格式并提供了一些模型对象,则可能会引发上述异常。

    (Q): 是否明确需要定义这些参数 # CELERY_ACCEPT_CONTENT=['json', ], # CELERY_TASK_SERIALIZER='json', # CELERY_RESULT_SERIALIZER='json',

    【讨论】:

      【解决方案2】:

      我可能已经找到了解决方案。只需将事件内部的 sendMail() 函数重构为主要任务,因此无需将对象解析为 json:

      @celery.task(name='tasks.check_for_events')
      @periodic_task(run_every=datetime.timedelta(minutes=1))  
      def check_for_events():    
          now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
          events = list(Event.objects.filter(reminder_date_time__range=(now - datetime.timedelta(minutes=5), now)))
          for event in events:        
              subject = 'Event Reminder'
              link = None
              message = ... 
              sendEmail.delay(subject, message, event.user.email)
      
      
      @celery.task(name='tasks.sendEmail')
      def sendEmail(subject, message, email):
          send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [email])
      

      这适用于 Rabbitmq 和 Amazon SQS

      【讨论】:

        猜你喜欢
        • 2011-12-24
        • 1970-01-01
        • 2022-11-10
        • 2021-12-24
        • 2013-04-26
        • 2017-04-25
        • 1970-01-01
        • 2015-01-07
        • 2019-07-05
        相关资源
        最近更新 更多