diff --git a/taskiq_redis/redis_broker.py b/taskiq_redis/redis_broker.py index b1ad461..2057a9b 100644 --- a/taskiq_redis/redis_broker.py +++ b/taskiq_redis/redis_broker.py @@ -8,7 +8,14 @@ TypeVar, ) -from redis.asyncio import BlockingConnectionPool, Connection, Redis, ResponseError +from redis.asyncio import ( + BlockingConnectionPool, + Connection, + ConnectionError, + Redis, + ResponseError, + TimeoutError, +) from taskiq import AckableMessage from taskiq.abc.broker import AsyncBroker from taskiq.abc.result_backend import AsyncResultBackend @@ -133,7 +140,7 @@ async def listen(self) -> AsyncGenerator[bytes, None]: if brpop_result is None: continue yield brpop_result[redis_brpop_data_position] # type: ignore[misc] - except ConnectionError as exc: + except (ConnectionError, TimeoutError) as exc: logger.warning("Redis connection error: %s", exc) continue diff --git a/tests/test_broker.py b/tests/test_broker.py index 3ee4665..f53aba7 100644 --- a/tests/test_broker.py +++ b/tests/test_broker.py @@ -103,6 +103,16 @@ async def test_pub_sub_broker_max_connections( await broker.shutdown() +@pytest.mark.anyio +async def test_list_queue_broker_retries_on_connection_error() -> None: + """Test that listen() retries on a redis ConnectionError instead of raising.""" + broker = ListQueueBroker(url="redis://localhost:1/0") + gen = broker.listen() + + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(gen.__anext__(), timeout=0.5) + + @pytest.mark.anyio async def test_list_queue_broker( valid_broker_message: BrokerMessage,