客戶端連接rabbitmq后,如果長時間沒有數據的傳輸,rabbitmq會申請關閉TCP連接,造成該TCP連接下的所有的信道都不可用,很多時候為了傳輸數據的高效率,我們會先創建一個信道池,這樣省去了每次數據傳輸連接和釋放連接的時間,但由於rabbitmq可能會遠程關閉連接,因此需要判斷連接池中的通道是否還有效;
判斷TCP連接和channel
import pika # 首先創建一個TCP連接 # 添加用戶名和密碼 credentials = pika.PlainCredentials(self.__username, self.__passwd) # 配置連接參數 parameters = pika.ConnectionParameters(host=self.__host, port=self.__port, credentials=credentials) # 創建一個連接對象 connection = pika.BlockingConnection(parameters) # 創建一個信道 channel = connection.channel()
connection和channel判斷相關的重要方法:
-
connection.is_closed:判斷當前的TCP是否關閉,如果是關閉返回True,如果處於連接狀態,返回False;
-
connection.is_closing:判斷當前的TCP連接已發起關閉,但關閉還沒有完成的狀態,如果是關閉返回True,如果處於連接狀態,返回False;
-
connection.is_open:判斷當前的TCP連接是否打開,打開返回True,關閉返回False;
-
channel.is_open:判斷當前的channel是否打開,打開返回True,關閉返回False;
-
channel.is_closed:判斷當前的channel是否打開,如果是關閉返回True,如果打開返回False
注意
-
connection關閉后,該連接下面的所有的channel都會關閉;
-
is_closed和is_open這種函數只能判斷客戶端的連接是否打開或關閉,但是無法判斷服務端連接的狀態,所以當服務端遠程關閉了連接時,客戶端是不能感知到的;
-
可以設置心跳用來自動關閉異常的TCP連接;
-
如果服務端遠程關閉了連接,當客戶端發送消息時,捕捉異常並重新建立連接;
參考
supervisor之啟動rabbitmq報錯原因: https://www.cnblogs.com/cwp-bg/p/8939792.html