2012-03-26 31 views
12

Tôi đang chạy mã trên python để gửi và nhận từ hàng đợi RabbitMQ từ một ứng dụng khác mà tôi không thể cho phép luồng. Đây là câu hỏi rất mới nhưng, có khả năng chỉ kiểm tra xem có tin nhắn không và nếu không có thì chỉ cần bỏ nghe? Làm thế nào tôi nên thay đổi ví dụ "Hello world" cơ bản cho nhiệm vụ đó? Hiện tại tôi đã quản lý để ngừng tiêu thụ nếu tôi nhận được một tin nhắn, nhưng nếu không có tin nhắn phương pháp của tôi nhận được() chỉ cần tiếp tục chờ đợi. Làm thế nào để buộc nó không phải chờ đợi nếu không có tin nhắn? Hoặc có thể chỉ chờ một lượng thời gian nhất định?RabbitMQ tiêu thụ một thông báo nếu tồn tại và thoát

import pika 

global answer 

def send(msg): 
    connection = pika.BlockingConnection(pika.ConnectionParameters()) 
    channel = connection.channel() 
    channel.queue_declare(queue='toJ') 
    channel.basic_publish(exchange='', routing_key='toJ', body=msg) 
    connection.close() 

def receive(): 
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) 
    channel = connection.channel() 
    channel.queue_declare(queue='toM') 
    channel.basic_consume(callback, queue='toM', no_ack=True) 
    global answer 
    return answer 

def callback(ch, method, properties, body): 
    ch.stop_consuming() 
    global answer 
    answer = body 
+0

API ruby ​​có một phương pháp để kiểm tra độ dài của hàng đợi .. có bạn kiểm tra các tài liệu python? –

Trả lời

15

Ok, tôi thấy giải pháp sau đây:

def receive(): 
    parameters = pika.ConnectionParameters(RabbitMQ_server) 
    connection = pika.BlockingConnection(parameters) 
    channel = connection.channel() 
    channel.queue_declare(queue='toM') 
    method_frame, header_frame, body = channel.basic_get(queue = 'toM')   
    if method_frame.NAME == 'Basic.GetEmpty': 
     connection.close() 
     return '' 
    else:    
     channel.basic_ack(delivery_tag=method_frame.delivery_tag) 
     connection.close() 
     return body 
+0

Cũng nên kiểm tra xem method_frame có là None hay không. Nếu không có thêm thông báo nào trong hàng đợi, channel.basic_get (queue = 'toM') sẽ trả về với None-s. – balas

Các vấn đề liên quan