2011-05-07 16 views
0

我正試圖編寫一個使用RabbitMQ的Pika library的Python應用程序。我正在使用最新版本0.9.5。我的問題是我的Python代碼無法檢測到它的RabbitMQ用戶名和密碼不正確,因爲我無法弄清楚如何註冊一個Pika回調函數來告訴我這個錯誤。我的代碼是使這樣的連接:Python如何檢測到我的RabbitMQ密碼失敗?

import pika 

class MyClient(object): 
    def __init__(self, host, username, password): 
     self.host = host 
     self.username = username 
     self.password = password 
     self.connection = None 

    def connect(self): 
     credentials = pika.PlainCredentials(self.username, self.password) 
     parameters = pika.ConnectionParameters(
      host=self.host, credentials=credentials, heartbeat=True, 
      ) 
     self.connection = pika.SelectConnection(
      parameters, self.on_connected, 
      ) 
     self.connection.add_on_close_callback(self.on_close) 
     self.connection.ioloop.start() 

    def on_connected(self, *args, **kw): 
     print 'I am connected!', args, kw 

    def on_close(self, *args, **kw): 
     print 'I am closed!', args, kw 

my_client = MyClient('...', '...', '...') 
my_client.connect() 

# (Good, I remembered to remove the username and password 
# before pasting to Stack Overflow!) 

如果我運行此腳本,那麼ioloop運行了一下上述三秒鐘,然後程序終止。我無法弄清楚如何註冊回調,甚至只是簡單地檢查死連接的狀態,以確定發生了錯誤或明確找出錯誤的密碼錯誤。我錯過了Pika文檔中至關重要的東西嗎?

有人能幫我理解Pika 0.9.5錯誤處理應該如何工作嗎?或者是0.9.5某種可怕的實驗,我應該避免使用早期版本的Pika,現在我注意到this email message,似乎表明這個新的發展路線已經成爲死衚衕了?

感謝您的幫助!

回答

1

起初,我想,如果登錄失敗pika.exceptions.LoginError提高。但是,僅當AMQP代理不支持所提供的認證類型時纔會產生。它是而不是因不成功的身份驗證而引發。

經過一些在Pika源代碼中打印(打印入境框架)後,似乎在客戶端發送Connection.StartOK(其中包括憑證)之後,如果它們未被接受,則不會收到響應。如果他們接受,則接收的下一個幀是Connection.Tune

我不確定答案是什麼。嘗試使用默認的「guest:guest」憑據。如果他們失敗了,也許你有一個不同的問題。您的代碼片段適用於我的默認用戶名:密碼。你想要做AMQP與Python

+0

我沒有看到那個例外的任何位置升高,從而抓住這顯然是有問題的 - 這將是巨大的,如果您發現該庫被誘導與我分享的異常,而不是隱藏它拿走的方式 - 我至少很高興知道它存在! – 2011-05-09 02:26:18

1

我,那麼你需要有可用於搜索和瀏覽您的庫的源代碼的副本。通過使用API​​文檔,您無法使用這些庫成功。

在這種情況下,我假設你沒有得到一個回溯,因爲異常被抓的地方忽略。否則,您會看到需要在回溯底部捕獲的異常。請記住,異常是對象,一些庫使用諸如socket.error之類的名稱而不是TypeError或IOError。

您可能需要通過尋找所有except語句代碼打獵並添加log.debug()調用它們。

如果您修復了pika代碼,請確保提交補丁。