2010-02-03 73 views
2

我想確保我的消息被傳送到隊列中。如何在AMQP的python客戶端使用basic.return進行監聽

爲此,我將強制參數添加到basic_publish中。 如果我的郵件未成功發送,還應該怎麼做才能收到basic.return郵件?

我不能使用channel.wait()來收聽basic.return,因爲當我的郵件成功發送時,wait()函數將永久掛起。 (沒有超時) 另一方面。當我不呼叫channel.wait()時,channel.returned_messages將保持爲空,即使郵件未送達。

我使用py-amqplib版本0.6。

任何解決方案,歡迎。

+0

我有蟒蛇鼠庫完全一樣的問題,看起來甚至沒有人對這個問題的會談。我找不到任何演示如何處理失敗消息的代碼片段。 – harry 2011-03-01 10:40:39

回答

1

當代理中放置消息時,由於basic.return是異步發送的,所以目前不可能。當消息發送成功時,不從服務器報告數據。 所以pyAMQP不能監聽這樣的消息。

我讀過關於這個問題的幾條線索。可能的解決方案是:

  • 使用txAMQP,AMQP,處理basic.return
  • 使用pyAMQP與等待與超時的扭曲版本。 (我不確定目前是否可行)
  • 經常使用同步命令ping服務器,以便pyAMQP能夠在到達時選擇basic.return消息。

由於對pyAMQP和rabbitMQ的支持水平一般都很低,我們決定根本不使用amqp代理。

1

您是否嘗試過唯一完整的Python AMQP庫?它沒有被廣泛使用,因爲它沒有整齊地包裝。

步驟1.編譯C庫 - 你可能需要sudo apt-get install autotools-dev autoconf automake libtool

mkdir rabbitc 
cd rabbitc 
hg clone http://hg.rabbitmq.com/rabbitmq-codegen/ 
hg clone http://hg.rabbitmq.com/rabbitmq-c/ 
cd rabbitmq-c 
autoreconf -i 
make clean 
./configure --prefix=/usr 
make 
sudo make install 

步驟2.安裝Python庫

pip install pylibrabbitmq 
1

你不能這樣做同步,因爲它是一個異步系統。但是你可以使用線程來解決這個問題。

基本思想是,你啓動一個線程,在通道上進行等待,每當它退出等待時,就會爲返回的消息隊列中的任何返回消息調用call_back函數。 然後,您可以與該消息處理,但是你想在call_back功能

def registerCallback(channel, call_back): 
    """ This method sets up a thread which deals with the asynchronous callback for a message which could not be routed by the exchange. 
    """ 
    def wait(): 
     try: 
      channel.wait() 
     except Exception, e: 
      print("Problem waiting on publish channel: %s" % str(e)) 

     while not channel.returned_messages.empty(): 
      returnedMessage = channel.returned_messages.get() 
      processReturnedMessageThread = Thread(target=call_back, args=(returnedMessage)) 
      processReturnedMessageThread.start() 

     wait() 

    waiting = Thread(target=wait) 
    waiting.start() 
相關問題