2

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

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

在一段中它说:

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(' is not JSON serializable',)

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

4

2 回答 2

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

于 2013-01-26T11:39:28.523 回答
1

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

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

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

于 2015-07-21T11:37:51.510 回答