2015-02-08 133 views
0

我希望我的python腳本能夠在將任務發送至隊列之前不斷運行並檢查隊列大小是否爲零。下面是一個片段:RabbitMQ - 如何獲取隊列大小

#!/usr/bin/env python 
import pika 
import sys 

while True: 

    # establish connection with RabbitMQ server 
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) 
    channel = connection.channel() 

    # create queue 
    # durable=True make sure RabbitMQ never lose our queue 
    rabbit_queue = channel.queue_declare(queue="task_queue", durable=True) 

    queue_size = rabbit_queue.method.message_count 
    if queue_size <= 0: 
     message = get_message() 
     channel.basic_publish(exchange='', 
           routing_key="task_queue", 
           body=message, 
           properties=pika.BasicProperties(
            delivery_mode=2, # make message persistent 
          )) 

     print " [x] Sent %r" % (message,) 
     time.sleep(3) 

    # close connection to flush network buffers AND ensure our message was actually delivered to RabbitMQ 
    connection.close() 

不斷重新建立連接是否是一種好的做法?

+0

實在是太寬泛。最正確的答案:這取決於此腳本運行的頻率,您的基礎架構,典型的AMQP代理負載。 – pinepain 2015-02-08 16:06:28

+0

此腳本作爲後臺腳本運行。它nv停止(即:while循環)。我創造了大約6個隊列。每個隊列可能有大約1500個任務 – nuttynibbles 2015-02-08 16:32:40

+0

試試吧。如果你遇到性能問題,那麼你一定會知道該怎麼做。 – pinepain 2015-02-08 18:05:17

回答

0

我看不出有任何理由不打開/關閉的while循環外移動連接:

#!/usr/bin/env python 

import pika 
import sys 


# establish connection with RabbitMQ server 
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) 

try: 
    channel = connection.channel() 

    # create queue 
    # durable=True make sure RabbitMQ never lose our queue 
    channel.queue_declare(queue="task_queue", durable=True) 

    while True: 
     rabbit_queue = channel.queue_declare(queue="task_queue", durable=True, passive=True) 
     queue_size = rabbit_queue.method.message_count 
     if queue_size <= 0: 
      message = get_message() 
      channel.basic_publish(exchange='', 
            routing_key="task_queue", 
            body=message, 
            properties=pika.BasicProperties(
            delivery_mode=2, # make message persistent 
           )) 

      print " [x] Sent %r" % (message,) 
      time.sleep(3) 
finally: 
    connection.close()