【问题标题】:Sending message to RabbitMQ (pika) from scheduler callback doesn't work从调度程序回调向 RabbitMQ (pika) 发送消息不起作用
【发布时间】:2012-06-12 20:21:00
【问题描述】:

我需要将不同的消息发送到队列 - 每条消息都按其个人日程安排。所以我有消息列表和相关的间隔来重新发送每一个。我使用rabbitMQ/pika 和apscheduler。 根据无数的例子,我创建了最简单的 BlockingConnection/channel/queue。在那之后我立即尝试推送消息 - 一切正常,我可以在 rabbitmq web-interface 中看到所有消息都在队列中。这是一段有效的代码:

    self.cr = Queue('DIRECT_C_QUEUE', True, ex_type='direct')
    for i in range(1,10000):
        self.cr.channel.basic_publish(exchange='', routing_key='DIRECT_C_QUEUE', body='hello_world')

但是,如果我尝试通过 apscheduler 回调函数推送消息(以完全相同的方式) - 队列中只有少数(大约 1-10 条)消息出现(但回调一直被触发,发布时没有任何异常消息!)。

我终于开始收到这样的警告:

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pika/connection.py:642:UserWarning:Pika:写入缓冲区在 1125 字节处超出警告阈值,估计为 43后面的框架 警告(消息 %(self.outbound_buffer.size,est_frames_behind))

队列中仍然没有新消息。

我是python新手,非常感谢任何帮助。

【问题讨论】:

    标签: python scheduling rabbitmq pika


    【解决方案1】:

    我通过增加 ulimit 解决了这个问题

    编辑 /etc/default/rabbitmq-server 并设置

    ulimit -n 4096

    然后重启rabbitmq

    sudo /etc/init.d/rabbitmq-server 重启

    【讨论】:

      【解决方案2】:

      我找到了问题的根源: apscheduler 在单独的线程中运行 basic_publish 调用,pika 不建议在线程之间共享连接 - http://pika.github.com/faq.html

      所以我可以选择每次创建新连接,或者将新消息放入某个队列并从主线程(创建连接的位置)发布它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多