Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions taskiq_redis/redis_broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
10 changes: 10 additions & 0 deletions tests/test_broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down