buz 2.15.3__py3-none-any.whl → 2.15.5__py3-none-any.whl

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.
@@ -0,0 +1,8 @@
1
+ class MaxConsumerRetryException(Exception):
2
+ def __init__(
3
+ self,
4
+ *,
5
+ event_id: str,
6
+ subscriber_fqn: str,
7
+ ) -> None:
8
+ super().__init__(f"Max retries reached, discarding event {event_id} for subscriber {subscriber_fqn}")
@@ -5,6 +5,7 @@ from typing import Optional, Sequence, cast
5
5
  from buz.event import Event
6
6
  from buz.event.async_subscriber import AsyncSubscriber
7
7
  from buz.event.infrastructure.buz_kafka.consume_strategy.kafka_on_fail_strategy import KafkaOnFailStrategy
8
+ from buz.event.infrastructure.buz_kafka.exceptions.max_consumer_retry_exception import MaxConsumerRetryException
8
9
  from buz.event.infrastructure.buz_kafka.exceptions.retry_exception import ConsumerRetryException
9
10
  from buz.event.infrastructure.buz_kafka.kafka_event_subscriber_executor import KafkaEventSubscriberExecutor
10
11
  from buz.event.middleware.async_consume_middleware import AsyncConsumeMiddleware
@@ -78,8 +79,30 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
78
79
  )
79
80
 
80
81
  async def __perform_consume(self, event: Event, subscriber: AsyncSubscriber) -> None:
81
- should_retry = True
82
82
  number_of_executions = 0
83
+ should_retry = True
84
+
85
+ if self.__consume_retrier is not None:
86
+ should_retry = self.__consume_retrier.should_retry(event, [subscriber])
87
+
88
+ if should_retry is False:
89
+ max_retry_exception = MaxConsumerRetryException(
90
+ event_id=event.id,
91
+ subscriber_fqn=subscriber.fqn(),
92
+ )
93
+
94
+ if self.__on_fail_strategy == KafkaOnFailStrategy.STOP_ON_FAIL:
95
+ raise max_retry_exception
96
+
97
+ self.__logger.warning(
98
+ f"The event {event.id} with the subscriber {subscriber.fqn()} has reach the max number of retries, it will be consumed but not processed"
99
+ )
100
+
101
+ if self.__reject_callback is not None:
102
+ self.__reject_callback.on_reject(event=event, subscribers=[subscriber], exception=max_retry_exception)
103
+
104
+ return
105
+
83
106
  while should_retry is True:
84
107
  try:
85
108
  self.__register_retry(event, subscriber)
@@ -102,7 +125,7 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
102
125
 
103
126
  self.__logger.exception(exception)
104
127
 
105
- if self.__reject_callback:
128
+ if self.__reject_callback is not None:
106
129
  self.__reject_callback.on_reject(event=event, subscribers=[subscriber], exception=exception)
107
130
 
108
131
  if self.__on_fail_strategy == KafkaOnFailStrategy.STOP_ON_FAIL:
@@ -4,6 +4,7 @@ import time
4
4
  from typing import Optional, Sequence, cast
5
5
  from buz.event import Event
6
6
  from buz.event.infrastructure.buz_kafka.consume_strategy.kafka_on_fail_strategy import KafkaOnFailStrategy
7
+ from buz.event.infrastructure.buz_kafka.exceptions.max_consumer_retry_exception import MaxConsumerRetryException
7
8
  from buz.event.infrastructure.buz_kafka.exceptions.retry_exception import ConsumerRetryException
8
9
  from buz.event.infrastructure.buz_kafka.kafka_event_subscriber_executor import KafkaEventSubscriberExecutor
9
10
  from buz.event.middleware.consume_middleware import ConsumeMiddleware
@@ -82,12 +83,34 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
82
83
  )
83
84
 
84
85
  def __perform_consume(self, event: Event, subscriber: Subscriber) -> None:
86
+ number_of_executions = 0
85
87
  should_retry = True
86
- execution_number = 0
88
+
89
+ if self.__consume_retrier is not None:
90
+ should_retry = self.__consume_retrier.should_retry(event, [subscriber])
91
+
92
+ if should_retry is False:
93
+ max_retry_exception = MaxConsumerRetryException(
94
+ event_id=event.id,
95
+ subscriber_fqn=subscriber.fqn(),
96
+ )
97
+
98
+ if self.__on_fail_strategy == KafkaOnFailStrategy.STOP_ON_FAIL:
99
+ raise max_retry_exception
100
+
101
+ self.__logger.warning(
102
+ f"The event {event.id} with the subscriber {subscriber.fqn()} has reach the max number of retries, it will be consumed but not processed"
103
+ )
104
+
105
+ if self.__reject_callback is not None:
106
+ self.__reject_callback.on_reject(event=event, subscribers=[subscriber], exception=max_retry_exception)
107
+
108
+ return
109
+
87
110
  while should_retry is True:
88
111
  try:
89
112
  self.__register_retry(event, subscriber)
90
- execution_number += 1
113
+ number_of_executions += 1
91
114
  subscriber.consume(event)
92
115
  self.__clean_retries(event, subscriber)
93
116
  return
@@ -95,7 +118,7 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
95
118
  if self.__should_retry(event, subscriber) is True:
96
119
  self.__logger.warning(
97
120
  ConsumerRetryException(
98
- number_of_executions=execution_number,
121
+ number_of_executions=number_of_executions,
99
122
  event_id=event.id,
100
123
  subscriber_fqn=subscriber.fqn(),
101
124
  ),
@@ -106,7 +129,7 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
106
129
 
107
130
  self.__logger.exception(exception)
108
131
 
109
- if self.__reject_callback:
132
+ if self.__reject_callback is not None:
110
133
  self.__reject_callback.on_reject(event=event, subscribers=[subscriber], exception=exception)
111
134
 
112
135
  if self.__on_fail_strategy == KafkaOnFailStrategy.STOP_ON_FAIL:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buz
3
- Version: 2.15.3
3
+ Version: 2.15.5
4
4
  Summary: Buz is a set of light, simple and extensible implementations of event, command and query buses.
5
5
  License: MIT
6
6
  Author: Luis Pintado Lozano
@@ -25,7 +25,6 @@ Provides-Extra: pypendency
25
25
  Requires-Dist: aiohttp (>=3.11.13,<4.0.0)
26
26
  Requires-Dist: aiokafka[lz4] (==0.12.0) ; extra == "aiokafka"
27
27
  Requires-Dist: asgiref (>=3.8.1,<4.0.0) ; extra == "aiokafka"
28
- Requires-Dist: asyncio (>=3.4.3,<4.0.0) ; extra == "aiokafka"
29
28
  Requires-Dist: cachetools (>=5.5.0,<6.0.0)
30
29
  Requires-Dist: dacite (>=1.8.1,<2.0.0)
31
30
  Requires-Dist: kafka-python-ng (==2.2.3)
@@ -57,10 +57,11 @@ buz/event/infrastructure/buz_kafka/consume_strategy/kafka_on_fail_strategy.py,sh
57
57
  buz/event/infrastructure/buz_kafka/consume_strategy/topic_and_subscription_group_per_subscriber_kafka_consumer_strategy.py,sha256=LX9mARKCLKyyo4loxegxR_s4qNP1QfabXXYp4Keusts,634
58
58
  buz/event/infrastructure/buz_kafka/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
59
  buz/event/infrastructure/buz_kafka/exceptions/kafka_event_bus_config_not_valid_exception.py,sha256=VUKZXA2ygjg21P4DADFl_Tace6RwSXia1MRYvJypxbM,135
60
+ buz/event/infrastructure/buz_kafka/exceptions/max_consumer_retry_exception.py,sha256=5O33uUC8FLILY1C13tQwkfsLSXrmbe0vMaUfBmOuXdU,264
60
61
  buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py,sha256=Fq9kvI3DpFsGD3x2icmQ1fYIsuKZAFqI3tCibAuEtSQ,441
61
- buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py,sha256=hV-fNofLmj_286ZCO-YFOY4fMvGo4S2K0-KofzgJOdg,5838
62
+ buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py,sha256=KDJjeY1z8ZJGKGmEUB7OxknenBCI0o0WkgcNkNmQITU,6804
62
63
  buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py,sha256=EyG2vsFYErWAyqxdXqSwxx5Zi_y0d6i0h05XavJMnxg,254
63
- buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py,sha256=Kne6wiSQt_y2cVHoGtNK2N9-N59Wib8id77sjmXWsc4,5871
64
+ buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py,sha256=tuK9gHJXuGwHtfjYNEoLi-aKOGv_YjOeqPg_1zns7NM,6849
64
65
  buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
66
  buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py,sha256=zIkgMnUU7ueG6QHEubMzdTHOtqdldIbS7k5FDLNmqVk,178
66
67
  buz/event/infrastructure/buz_kafka/publish_strategy/topic_per_event_kafka_publish_strategy.py,sha256=aLKj6GyLJNcMbuDA1QBa-RzWKBHEorBuPFkkqo_H60k,405
@@ -249,7 +250,7 @@ buz/serializer/message_to_json_bytes_serializer.py,sha256=RGZJ64t4t4Pz2FCASZZCv-
249
250
  buz/wrapper/__init__.py,sha256=GnRdJFcncn-qp0hzDG9dBHLmTJSbHFVjE_yr-MdW_n4,77
250
251
  buz/wrapper/async_to_sync.py,sha256=OfK-vrVUhuN-LLLvekLdMbQYtH0ue5lfbvuasj6ovMI,698
251
252
  buz/wrapper/event_loop.py,sha256=pfBJ1g-8A2a3YgW8Gf9Fg0kkewoh3-wgTy2KIFDyfHk,266
252
- buz-2.15.3.dist-info/LICENSE,sha256=Jytu2S-2SPEgsB0y6BF-_LUxIWY7402fl0JSh36TLZE,1062
253
- buz-2.15.3.dist-info/METADATA,sha256=2ExuuBEvU3BAKlR7o04dBPhqCMvC_rSjZMyZv11qwX0,1659
254
- buz-2.15.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
255
- buz-2.15.3.dist-info/RECORD,,
253
+ buz-2.15.5.dist-info/LICENSE,sha256=Jytu2S-2SPEgsB0y6BF-_LUxIWY7402fl0JSh36TLZE,1062
254
+ buz-2.15.5.dist-info/METADATA,sha256=03PX-BsDZh2PjvQtxlCMhw-lscDMXCxVA1ao0CKFSF8,1597
255
+ buz-2.15.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
256
+ buz-2.15.5.dist-info/RECORD,,
File without changes
File without changes