客户详细信息:从http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git获取的Paho MQTT Python客户端,SHA id 300fcbdffd62d08f627f94f3074463cfa532ca87
代理详细信息:带有MQTT插件的RabbitMQ 3.3.4
在第一个场景中,所有内容都在本地运行并启用了SSL。我正在以一种方式使用客户端,我有一个单独的进程来发布消息(> 10000条消息)并且不等待发布之间的确认。该错误是self._ssl.read(1)从client.py中_packet_read的以下代码片段返回零长度值的结果:
...
if self._in_packet['command'] == 0:
try:
if self._ssl:
command = self._ssl.read(1)
else:
command = self._sock.recv(1)
except socket.error as err:
...
else:
if len(command) == 0:
return 1
command = struct.unpack("!B", command)
self._in_packet['command'] = command[0]
...
并在从RabbitMQ接收和解析25个确认后发生。发生此错误后,我不再收到经纪人的任何回复。
如果我在禁用SSL的情况下运行,则不会遇到任何错误,并且可以成功接收所有已发送邮件的确认。
如果我远程运行代理(互联网上的某个位置),我会通过SSL获得相同的结果。但是,当不使用SSL时,我会以不同的时间间隔获得读取错误/断开连接但客户端能够恢复/重新连接,并且我收到所有已发送消息的代理确认。
以下是我正在使用的客户端配置:
...
client = Client('foo')
client.max_inflight_messages_set(65536)
client.on_connect = self.on_connect_callback
client.on_disconnect = self.on_disconnect_callback
client.on_publish = self.on_publish_callback
client.on_message = self.on_message_callback
client.username_pw_set('foo', 'bar')
client.tls_set("ca-cert.pem",
"client-cert.pem",
"client-key.pem")
client.will_set(topic="last_will/foo",
payload=Message().body, qos=1)
client.connect('127.0.0.1', 8883, 30)
client.loop_start()
...
有关可能导致此问题和/或故障排除建议的任何想法吗?
UPDATE 20140828:我正在单步执行loop_read并注意到在成功接收到第一个完整数据包(连接确认)后,我得到一个空的套接字返回值。在socket.recv调用之前调用select,表示在套接字上有数据可供读取。这可能是套接字缓冲区问题吗?我不确定Python套接字接收缓冲区(btw我在OSX上运行它)的行为是否溢出。