我正在尝试使用Pika发布使用Celery任务的消息。
from celery import shared_task
from django.conf import settings
import json
@shared_task
def publish_message():
params = pika.URLParameters(settings.BROKER_URL + '?' + 'socket_timeout=10&' + 'connection_attempts=2')
conn = pika.BlockingConnection(parameters=params)
channel = conn.channel()
channel.exchange_declare(
exchange = 'foo',
type='topic'
)
channel.tx_select()
channel.basic_publish(
exchange = 'foo',
routing_key = 'bar',
body = json.dumps({'foo':'bar'}),
properties = pika.BasicProperties(content_type='application/json')
)
channel.tx_commit()
conn.close()
从视图中调用此任务。
由于一些奇怪的原因,有时是随机的,消息不会排队。就我而言,每一条消息都会被删除。我在这里缺少什么?
答案 0 :(得分:1)
我建议你在pika中启用confirm_delivery。这将确保正确传递邮件,并且如果由于某种原因无法传递邮件。 Pika会因为异常而失败,或者返回False。
channel.confirm_delivery()
successful = channel.basic_publish(...)
如果进程失败,您可以尝试再次发送邮件,或者从异常中记录错误消息,以便您可以采取相应的行动。
答案 1 :(得分:0)
试试这个:
chanel = conn.channel()
try:
chanel.queue_declare(queue='foo')
except:
pass
chanel.basic_publish(
exchange='',
routing_key='foo',
body=json.dumps({'foo':'bar'})
)