Amazon SQS和芹菜事件(不是JSON可序列化的)

时间:2013-01-26 00:16:19

标签: django celery django-celery amazon-sqs

我今天在寻找Amazon SQS作为在EC2实例上安装我自己的RabbitMQ的替代方法。

我已按照here

所述的文档进行操作

在段落中说:

  

SQS尚未支持活动,因此不能与芹菜一起使用   事件,celerymon或Django Admin监视器。

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

e.g。

@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 serializable',)

正如文档中指出的那样SQS的限制还是我做了一些根本错误的事情? 非常感谢您的建议,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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