gpt4 book ai didi

django - Amazon SQS 和 celery 事件(不可序列化的 JSON)

转载 作者:行者123 更新时间:2023-12-04 05:14:00 24 4
gpt4 key购买 nike

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

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

在一段中它说:

SQS does not yet support events, and so cannot be used with celery events, celerymon or the Django Admin monitor.

我有点搞不懂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] raised exception: TypeError(' is not JSON serializable',)

那么,是文档中指出的 SQS 的局限性,还是我做错了什么根本性的事情?非常感谢您的建议,

最佳答案

我可能已经找到了解决方案。只需将事件中的 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

关于django - Amazon SQS 和 celery 事件(不可序列化的 JSON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com