2011-11-19 22 views

Trả lời

6

Có hai cách để nhận kích thước hàng đợi trong giao thức AMQP. Bạn có thể sử dụng Queue.Declare hoặc Basic.Get.

Nếu bạn đang sử dụng tin nhắn khi họ sử dụng Basic.Consume, bạn không thể nhận được thông tin này trừ khi bạn ngắt kết nối (hết thời gian chờ) và redeclare hàng đợi, hoặc người khác nhận được một tin nhắn nhưng không ack nó. Trong các phiên bản AMQP mới hơn, bạn có thể chủ động yêu cầu thông báo.

Đối với Pika, tôi không biết chi tiết cụ thể nhưng khách hàng Python cho AMQP đã là một cái gai ở bên cạnh tôi. Thông thường, bạn sẽ cần đến các lớp monkeypatch để có được thông tin bạn cần hoặc cho phép người tiêu dùng xếp hàng hết thời gian chờ để bạn có thể thực hiện những việc khác trong khoảng thời gian định kỳ như số liệu thống kê hoặc tìm ra số lượng thư trong hàng đợi.

Một cách khác xung quanh việc này là từ bỏ và sử dụng lớp Ống để chạy sudo rabbitmqctl list_queues -p my_vhost. Sau đó phân tích đầu ra để tìm kích thước của tất cả các hàng đợi. Nếu bạn làm điều này, bạn sẽ cần phải cấu hình /etc/sudoers để không yêu cầu mật khẩu sudo thông thường.

Tôi cầu nguyện rằng người khác có nhiều kinh nghiệm Pika trả lời câu hỏi này bằng cách chỉ ra cách bạn có thể làm tất cả những điều tôi đã đề cập, trong trường hợp này tôi sẽ tải xuống Pika và đạp lốp. Nhưng nếu điều đó không xảy ra và bạn gặp khó khăn với việc bắt chước mã Pika, hãy xem haigha. Tôi thấy mã của họ đơn giản hơn nhiều so với các thư viện máy khách Python AMQP khác vì chúng gắn bó với giao thức AMQP hơn.

+0

Cảm ơn vì sudo rabbitmqctl list_queues -p my_vhost trick, tôi sẽ thử điều đó. – Sebastian

6

Bạn đã thử PyRabbit chưa? Nó có một số get_queue_depth()method có vẻ giống như những gì bạn đang tìm kiếm.

+1

Tôi không biết PyRabbit. Có vẻ hứa hẹn, tôi sẽ thử nó! – Sebastian

28

Tôi biết rằng câu hỏi này hơi cũ, nhưng đây là một ví dụ về việc làm điều này với pika.

Về AMQP và RabbitMQ, nếu bạn đã khai báo hàng đợi, bạn có thể khai báo lại hàng đợi bằng passive flag và giữ tất cả các thông số hàng đợi khác giống hệt nhau. Câu trả lời cho tuyên bố này declare-ok sẽ bao gồm số lượng thư trong hàng đợi.

Dưới đây là một ví dụ Với 0.9.5 pika:

import pika 

def on_callback(msg): 
    print msg 

params = pika.ConnectionParameters(
     host='localhost', 
     port=5672, 
     credentials=pika.credentials.PlainCredentials('guest', 'guest'), 
    ) 

# Open a connection to RabbitMQ on localhost using all default parameters 
connection = pika.BlockingConnection(parameters=params) 

# Open the channel 
channel = connection.channel() 

# Declare the queue 
channel.queue_declare(
     callback=on_callback, 
     queue="test", 
     durable=True, 
     exclusive=False, 
     auto_delete=False 
    ) 

# ... 

# Re-declare the queue with passive flag 
res = channel.queue_declare(
     callback=on_callback, 
     queue="test", 
     durable=True, 
     exclusive=False, 
     auto_delete=False, 
     passive=True 
    ) 
print 'Messages in queue %d' % res.method.message_count 

này sẽ in như sau:

<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])> 
<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])> 
Messages in queue 0 

Bạn nhận được số tin nhắn từ message_count thành viên.

+1

Cảm ơn rất nhiều. Câu trả lời của bạn giúp tôi. – Evgeniy

9

Dưới đây là cách bạn có thể nhận được độ dài hàng đợi bằng cách sử dụng pika (Xem bạn đang sử dụng tên người dùng và mật khẩu mặc định trên máy chủ cục bộ) thay thế tên q_name bằng tên hàng đợi của bạn.

import pika 
connection = pika.BlockingConnection() 
channel = connection.channel() 
q = channel.queue_declare(q_name) 
q_len = q.method.message_count 
Các vấn đề liên quan