redis-message-queue 8.2.9__tar.gz → 8.2.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/PKG-INFO +2 -2
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/README.md +1 -1
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/pyproject.toml +2 -2
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/redis_message_queue.py +31 -24
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/redis_message_queue.py +28 -22
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/.gitignore +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/LICENSE +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/__init__.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_abstract_redis_gateway.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_callable_utils.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_config.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_event.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_exceptions.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_payload_limits.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_queue_key_manager.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_redis_cluster.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_redis_gateway.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_stored_message.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/__init__.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/_abstract_redis_gateway.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/_redis_gateway.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/__init__.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/_event_driven.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/_implementation.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/_interface.py +0 -0
- {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/py.typed +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redis-message-queue
|
|
3
|
-
Version: 8.2.
|
|
3
|
+
Version: 8.2.10
|
|
4
4
|
Summary: Python message queuing with Redis and message deduplication
|
|
5
5
|
Project-URL: Homepage, https://github.com/Elijas/redis-message-queue
|
|
6
6
|
Project-URL: Repository, https://github.com/Elijas/redis-message-queue
|
|
@@ -34,7 +34,7 @@ Description-Content-Type: text/markdown
|
|
|
34
34
|
**Lightweight Python message queuing with Redis and built-in publish-side deduplication.** Deduplicate publishes within a TTL window, with optional crash recovery — across any number of producers and consumers.
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
pip install "redis-message-queue>=8.2.
|
|
37
|
+
pip install "redis-message-queue>=8.2.10,<9.0.0"
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Requires Redis server >= 6.2.
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
**Lightweight Python message queuing with Redis and built-in publish-side deduplication.** Deduplicate publishes within a TTL window, with optional crash recovery — across any number of producers and consumers.
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
pip install "redis-message-queue>=8.2.
|
|
14
|
+
pip install "redis-message-queue>=8.2.10,<9.0.0"
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
Requires Redis server >= 6.2.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "redis-message-queue"
|
|
3
|
-
version = "8.2.
|
|
3
|
+
version = "8.2.10"
|
|
4
4
|
description = "Python message queuing with Redis and message deduplication"
|
|
5
5
|
authors = [{ name = "Elijas", email = "4084885+Elijas@users.noreply.github.com" }]
|
|
6
6
|
readme = "README.md"
|
|
@@ -48,7 +48,7 @@ default-groups = ["dev", "test"]
|
|
|
48
48
|
##############################
|
|
49
49
|
|
|
50
50
|
[tool.bumpversion]
|
|
51
|
-
current_version = "8.2.
|
|
51
|
+
current_version = "8.2.10"
|
|
52
52
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
|
53
53
|
serialize = ["{major}.{minor}.{patch}"]
|
|
54
54
|
search = "{current_version}"
|
|
@@ -511,6 +511,29 @@ class _LeaseHeartbeat:
|
|
|
511
511
|
stacklevel=1,
|
|
512
512
|
)
|
|
513
513
|
|
|
514
|
+
async def _report_renewal_failure(self, exc: BaseException) -> None:
|
|
515
|
+
if self._stop_event.is_set():
|
|
516
|
+
return
|
|
517
|
+
logger.exception("Failed to renew message lease")
|
|
518
|
+
await self._emit(
|
|
519
|
+
"lease_renew_failed",
|
|
520
|
+
"failure",
|
|
521
|
+
message_id=self._message_id,
|
|
522
|
+
lease_token_hash=self._lease_token_hash,
|
|
523
|
+
exception_type=type(exc).__name__,
|
|
524
|
+
error=exc,
|
|
525
|
+
)
|
|
526
|
+
with warnings.catch_warnings():
|
|
527
|
+
warnings.simplefilter("always", RuntimeWarning)
|
|
528
|
+
warnings.warn(
|
|
529
|
+
"Failed to renew message lease "
|
|
530
|
+
f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
|
|
531
|
+
"when the visibility timeout expires",
|
|
532
|
+
RuntimeWarning,
|
|
533
|
+
stacklevel=1,
|
|
534
|
+
)
|
|
535
|
+
await self._invoke_failure_callback()
|
|
536
|
+
|
|
514
537
|
async def _run(self) -> None:
|
|
515
538
|
try:
|
|
516
539
|
while True:
|
|
@@ -531,30 +554,14 @@ class _LeaseHeartbeat:
|
|
|
531
554
|
f"gateway.renew_message_lease() must return bool, got {type(renewed).__name__}. "
|
|
532
555
|
"See AbstractRedisGateway.renew_message_lease for the full contract."
|
|
533
556
|
)
|
|
534
|
-
except asyncio.CancelledError:
|
|
535
|
-
|
|
557
|
+
except asyncio.CancelledError as exc:
|
|
558
|
+
current_task = asyncio.current_task()
|
|
559
|
+
if self._stop_event.is_set() or (current_task is not None and current_task.cancelling() > 0):
|
|
560
|
+
raise
|
|
561
|
+
await self._report_renewal_failure(exc)
|
|
562
|
+
return
|
|
536
563
|
except Exception as exc:
|
|
537
|
-
|
|
538
|
-
return
|
|
539
|
-
logger.exception("Failed to renew message lease")
|
|
540
|
-
await self._emit(
|
|
541
|
-
"lease_renew_failed",
|
|
542
|
-
"failure",
|
|
543
|
-
message_id=self._message_id,
|
|
544
|
-
lease_token_hash=self._lease_token_hash,
|
|
545
|
-
exception_type=type(exc).__name__,
|
|
546
|
-
error=exc,
|
|
547
|
-
)
|
|
548
|
-
with warnings.catch_warnings():
|
|
549
|
-
warnings.simplefilter("always", RuntimeWarning)
|
|
550
|
-
warnings.warn(
|
|
551
|
-
"Failed to renew message lease "
|
|
552
|
-
f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
|
|
553
|
-
"when the visibility timeout expires",
|
|
554
|
-
RuntimeWarning,
|
|
555
|
-
stacklevel=1,
|
|
556
|
-
)
|
|
557
|
-
await self._invoke_failure_callback()
|
|
564
|
+
await self._report_renewal_failure(exc)
|
|
558
565
|
return
|
|
559
566
|
if not renewed:
|
|
560
567
|
await self._emit(
|
|
@@ -1179,7 +1186,7 @@ class RedisMessageQueue:
|
|
|
1179
1186
|
"visibility timeouts are in use."
|
|
1180
1187
|
)
|
|
1181
1188
|
logger.warning(no_lease_token_warning)
|
|
1182
|
-
|
|
1189
|
+
_warn_runtime_warning(no_lease_token_warning, stacklevel=2)
|
|
1183
1190
|
|
|
1184
1191
|
if lease_token is None and self._requires_claimed_message:
|
|
1185
1192
|
raise GatewayContractError(
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/redis_message_queue.py
RENAMED
|
@@ -482,6 +482,29 @@ class _LeaseHeartbeat:
|
|
|
482
482
|
stacklevel=1,
|
|
483
483
|
)
|
|
484
484
|
|
|
485
|
+
def _report_renewal_failure(self, exc: BaseException) -> None:
|
|
486
|
+
if self._stop_event.is_set():
|
|
487
|
+
return
|
|
488
|
+
logger.exception("Failed to renew message lease")
|
|
489
|
+
self._emit(
|
|
490
|
+
"lease_renew_failed",
|
|
491
|
+
"failure",
|
|
492
|
+
message_id=self._message_id,
|
|
493
|
+
lease_token_hash=self._lease_token_hash,
|
|
494
|
+
exception_type=type(exc).__name__,
|
|
495
|
+
error=exc,
|
|
496
|
+
)
|
|
497
|
+
with warnings.catch_warnings():
|
|
498
|
+
warnings.simplefilter("always", RuntimeWarning)
|
|
499
|
+
warnings.warn(
|
|
500
|
+
"Failed to renew message lease "
|
|
501
|
+
f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
|
|
502
|
+
"when the visibility timeout expires",
|
|
503
|
+
RuntimeWarning,
|
|
504
|
+
stacklevel=1,
|
|
505
|
+
)
|
|
506
|
+
self._invoke_failure_callback()
|
|
507
|
+
|
|
485
508
|
def _run(self) -> None:
|
|
486
509
|
# No explicit _is_interrupted() check here. Heartbeat lifetime is owned
|
|
487
510
|
# by process_message, which sets _stop_event in its finally block on any
|
|
@@ -498,28 +521,11 @@ class _LeaseHeartbeat:
|
|
|
498
521
|
f"gateway.renew_message_lease() must return bool, got {type(renewed).__name__}. "
|
|
499
522
|
"See AbstractRedisGateway.renew_message_lease for the full contract."
|
|
500
523
|
)
|
|
524
|
+
except asyncio.CancelledError as exc:
|
|
525
|
+
self._report_renewal_failure(exc)
|
|
526
|
+
return
|
|
501
527
|
except Exception as exc:
|
|
502
|
-
|
|
503
|
-
return
|
|
504
|
-
logger.exception("Failed to renew message lease")
|
|
505
|
-
self._emit(
|
|
506
|
-
"lease_renew_failed",
|
|
507
|
-
"failure",
|
|
508
|
-
message_id=self._message_id,
|
|
509
|
-
lease_token_hash=self._lease_token_hash,
|
|
510
|
-
exception_type=type(exc).__name__,
|
|
511
|
-
error=exc,
|
|
512
|
-
)
|
|
513
|
-
with warnings.catch_warnings():
|
|
514
|
-
warnings.simplefilter("always", RuntimeWarning)
|
|
515
|
-
warnings.warn(
|
|
516
|
-
"Failed to renew message lease "
|
|
517
|
-
f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
|
|
518
|
-
"when the visibility timeout expires",
|
|
519
|
-
RuntimeWarning,
|
|
520
|
-
stacklevel=1,
|
|
521
|
-
)
|
|
522
|
-
self._invoke_failure_callback()
|
|
528
|
+
self._report_renewal_failure(exc)
|
|
523
529
|
return
|
|
524
530
|
if not renewed:
|
|
525
531
|
self._emit(
|
|
@@ -1150,7 +1156,7 @@ class RedisMessageQueue:
|
|
|
1150
1156
|
"visibility timeouts are in use."
|
|
1151
1157
|
)
|
|
1152
1158
|
logger.warning(no_lease_token_warning)
|
|
1153
|
-
|
|
1159
|
+
_warn_runtime_warning(no_lease_token_warning, stacklevel=2)
|
|
1154
1160
|
|
|
1155
1161
|
if lease_token is None and self._requires_claimed_message:
|
|
1156
1162
|
raise GatewayContractError(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_callable_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_payload_limits.py
RENAMED
|
File without changes
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_queue_key_manager.py
RENAMED
|
File without changes
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_redis_cluster.py
RENAMED
|
File without changes
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_redis_gateway.py
RENAMED
|
File without changes
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_stored_message.py
RENAMED
|
File without changes
|
{redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|