2012-06-08 24 views
0

我需要将不同的消息发送到队列 - 每个消息都由其个人计划表发送。所以我有消息列表和相关的时间间隔来重发每一个。我使用rabbitMQ/pika和apscheduler。根据大量的例子,我创建了最简单的BlockingConnection/channel/queue。之后,我立即尝试推送消息 - 一切正常,我可以在rabbitmq web界面中看到所有消息都在队列中。这里是工作的代码段:从调度程序回调向RabbitMQ(pika)发送消息不起作用

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 :鼠兔:写在1125个字节,并且一个估计的43帧缓冲超过警告阈后面 警告(消息%(self.outbound_buffer.size,est_frames_behind))

并且仍然在队列中没有新邮件。

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

回答

2

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

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

-1

我通过增加的ulimit

编辑/ etc /默认/ RabbitMQ的服务器固定的问题,并设置

的ulimit -n 4096

然后重新启动RabbitMQ的

sudo /etc/init.d/rabbitmq-server restart

+0

这是如何解决问题的? – mike