前言
客户端连接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连接;
-
如果服务端远程关闭了连接,当客户端发送消息时,捕捉异常并重新建立连接;