我今天在寻找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的限制还是我做了一些根本错误的事情? 非常感谢您的建议,
答案 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',