diff --git a/app/consumer/src/adapters/postgres.py b/app/consumer/src/adapters/postgres.py index 53aa3ae..e90c189 100644 --- a/app/consumer/src/adapters/postgres.py +++ b/app/consumer/src/adapters/postgres.py @@ -4,21 +4,22 @@ import time import psycopg2 from psycopg2.extensions import connection from ports import DeviceRepository, ReadingRepository +from exceptions import DatabaseConnectionError log = logging.getLogger(__name__) - -def connect(uri: str) -> connection: - for _ in range(10): +def connect(uri: str, retries: int = 10, base_delay: float = 1.0) -> connection: + for attempt in range(retries): try: conn = psycopg2.connect(uri) conn.autocommit = True log.info("PostgreSQL connecté") return conn - except Exception as e: - log.warning("Attente PostgreSQL... (%s)", e) - time.sleep(3) - raise RuntimeError("Impossible de se connecter à PostgreSQL") + except psycopg2.OperationalError as e: + delay = min(base_delay * 2 ** attempt, 30.0) + log.warning("Attente PostgreSQL (tentative %d/%d) : %s", attempt + 1, retries, e) + time.sleep(delay) + raise DatabaseConnectionError(f"Impossible de se connecter après {retries} tentatives") class PgDeviceRepository(DeviceRepository): diff --git a/app/consumer/src/exceptions.py b/app/consumer/src/exceptions.py new file mode 100644 index 0000000..7e78c34 --- /dev/null +++ b/app/consumer/src/exceptions.py @@ -0,0 +1,10 @@ +# domain/exceptions.py (ou dans domain.py directement) + +class InfrastructureError(Exception): + """Erreur technique levée par un adapter""" + +class DatabaseConnectionError(InfrastructureError): + """Impossible de se connecter à la db""" + +class MessageBrokerError(InfrastructureError): + """Impossible de se connecter au broker MQTT""" \ No newline at end of file