pika偶尔会丢弃basic_publish消息

时间:2015-02-26 19:14:34

标签: rabbitmq celery pika

我正在尝试使用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()

从视图中调用此任务。

由于一些奇怪的原因,有时是随机的,消息不会排队。就我而言,每一条消息都会被删除。我在这里缺少什么?

2 个答案:

答案 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'})
)