Fix error handling if broker can't be connected

HBMQTT-24
pull/8/head
Nicolas Jouanin 2015-08-12 18:46:56 +02:00
rodzic 74a66632cf
commit fd6ed3c42c
2 zmienionych plików z 32 dodań i 29 usunięć

Wyświetl plik

@ -7,8 +7,6 @@ import asyncio
import ssl import ssl
from urllib.parse import urlparse from urllib.parse import urlparse
from transitions import MachineError
from hbmqtt.utils import not_in_dict_or_none from hbmqtt.utils import not_in_dict_or_none
from hbmqtt.session import Session from hbmqtt.session import Session
from hbmqtt.mqtt.connack import * from hbmqtt.mqtt.connack import *
@ -30,8 +28,7 @@ class ClientException(BaseException):
class ConnectException(ClientException): class ConnectException(ClientException):
def __init__(self, code): pass
self.return_code = code
class MQTTClient: class MQTTClient:
@ -236,21 +233,29 @@ class MQTTClient:
except Exception as e: except Exception as e:
self.logger.warn("connection failed: %s" % e) self.logger.warn("connection failed: %s" % e)
self.session.transitions.disconnect() self.session.transitions.disconnect()
raise ClientException("connection Failed: %s" % e) raise ConnectException("connection Failed: %s" % e)
return_code = None
try :
connect_packet = self.build_connect_packet() connect_packet = self.build_connect_packet()
yield from connect_packet.to_stream(writer) yield from connect_packet.to_stream(writer)
self.logger.debug(" -out-> " + repr(connect_packet)) self.logger.debug(" -out-> " + repr(connect_packet))
try :
connack = yield from ConnackPacket.from_stream(reader) connack = yield from ConnackPacket.from_stream(reader)
self.logger.debug(" <-in-- " + repr(connack)) self.logger.debug(" <-in-- " + repr(connack))
return_code = connack.variable_header.return_code return_code = connack.variable_header.return_code
except Exception as e:
self.logger.warn("connection failed: %s" % e)
self.session.transitions.disconnect()
raise ClientException("connection Failed: %s" % e)
if return_code is not CONNECTION_ACCEPTED: if return_code is not CONNECTION_ACCEPTED:
yield from self._handler.stop() yield from self._handler.stop()
self.session.transitions.disconnect() self.session.transitions.disconnect()
self.logger.warn("Connection rejected with code '%s'" % return_code) self.logger.warn("Connection rejected with code '%s'" % return_code)
raise ConnectException(return_code) exc = ConnectException("Connection rejected by broker")
exc.return_code = return_code
raise exc
else: else:
# Handle MQTT protocol # Handle MQTT protocol
self._handler = ClientProtocolHandler(reader, writer, loop=self._loop) self._handler = ClientProtocolHandler(reader, writer, loop=self._loop)
@ -258,10 +263,6 @@ class MQTTClient:
yield from self._handler.start() yield from self._handler.start()
self.session.transitions.connect() self.session.transitions.connect()
self.logger.debug("connected to %s:%s" % (self.session.remote_address, self.session.remote_port)) self.logger.debug("connected to %s:%s" % (self.session.remote_address, self.session.remote_port))
except Exception as e:
self.logger.warn("connection failed: %s" % e)
self.session.transitions.disconnect()
raise ClientException("connection Failed: %s" % e)
def build_connect_packet(self): def build_connect_packet(self):
vh = ConnectVariableHeader() vh = ConnectVariableHeader()

Wyświetl plik

@ -1,7 +1,7 @@
import logging import logging
import asyncio import asyncio
from hbmqtt.client import MQTTClient from hbmqtt.client import MQTTClient, ConnectException
@ -44,13 +44,15 @@ def test_coro():
@asyncio.coroutine @asyncio.coroutine
def test_coro2(): def test_coro2():
try:
future = yield from C.connect('mqtt://localhost:1883/') future = yield from C.connect('mqtt://localhost:1883/')
future.add_done_callback(disconnected) future.add_done_callback(disconnected)
yield from asyncio.wait([asyncio.async(C.publish('a/b', b'TEST MESSAGE WITH QOS_1', qos=0x01))]) yield from asyncio.wait([asyncio.async(C.publish('a/b', b'TEST MESSAGE WITH QOS_1', qos=0x01))])
yield from asyncio.sleep(10)
yield from asyncio.wait([asyncio.async(C.publish('a/b', b'TEST MESSAGE WITH QOS_1', qos=0x01))])
logger.info("messages published") logger.info("messages published")
yield from C.disconnect() yield from C.disconnect()
except ConnectException as ce:
logger.error("Connection failed: %s" % ce)
asyncio.get_event_loop().stop()
if __name__ == '__main__': if __name__ == '__main__':