buz 2.15.2__py3-none-any.whl → 2.15.4__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,12 +79,36 @@ 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:
108
+ self.__register_retry(event, subscriber)
85
109
  number_of_executions += 1
86
110
  await subscriber.consume(event)
111
+ self.__clean_retry(event, subscriber)
87
112
  return
88
113
  except Exception as exception:
89
114
  if self.__should_retry(event, subscriber) is True:
@@ -95,13 +120,12 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
95
120
  ),
96
121
  exc_info=exception,
97
122
  )
98
- self.__register_retry(event, subscriber)
99
123
  await sleep(self.__seconds_between_retires)
100
124
  continue
101
125
 
102
126
  self.__logger.exception(exception)
103
127
 
104
- if self.__reject_callback:
128
+ if self.__reject_callback is not None:
105
129
  self.__reject_callback.on_reject(event=event, subscribers=[subscriber], exception=exception)
106
130
 
107
131
  if self.__on_fail_strategy == KafkaOnFailStrategy.STOP_ON_FAIL:
@@ -120,3 +144,9 @@ class KafkaEventAsyncSubscriberExecutor(KafkaEventSubscriberExecutor):
120
144
  return None
121
145
 
122
146
  return self.__consume_retrier.register_retry(event, [subscriber])
147
+
148
+ def __clean_retry(self, event: Event, subscriber: AsyncSubscriber) -> None:
149
+ if self.__consume_retrier is None:
150
+ return None
151
+
152
+ return self.__consume_retrier.clean_retries(event, [subscriber])
@@ -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,30 +83,53 @@ 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
- execution_number += 1
112
+ self.__register_retry(event, subscriber)
113
+ number_of_executions += 1
90
114
  subscriber.consume(event)
115
+ self.__clean_retries(event, subscriber)
91
116
  return
92
117
  except Exception as exception:
93
118
  if self.__should_retry(event, subscriber) is True:
94
119
  self.__logger.warning(
95
120
  ConsumerRetryException(
96
- number_of_executions=execution_number,
121
+ number_of_executions=number_of_executions,
97
122
  event_id=event.id,
98
123
  subscriber_fqn=subscriber.fqn(),
99
124
  ),
100
125
  exc_info=exception,
101
126
  )
102
- self.__register_retry(event, subscriber)
103
127
  time.sleep(self.__seconds_between_retires)
104
128
  continue
105
129
 
106
130
  self.__logger.exception(exception)
107
131
 
108
- if self.__reject_callback:
132
+ if self.__reject_callback is not None:
109
133
  self.__reject_callback.on_reject(event=event, subscribers=[subscriber], exception=exception)
110
134
 
111
135
  if self.__on_fail_strategy == KafkaOnFailStrategy.STOP_ON_FAIL:
@@ -124,3 +148,9 @@ class KafkaEventSyncSubscriberExecutor(KafkaEventSubscriberExecutor):
124
148
  return None
125
149
 
126
150
  return self.__consume_retrier.register_retry(event, [subscriber])
151
+
152
+ def __clean_retries(self, event: Event, subscriber: Subscriber) -> None:
153
+ if self.__consume_retrier is None:
154
+ return None
155
+
156
+ return self.__consume_retrier.clean_retries(event, [subscriber])
@@ -12,3 +12,7 @@ class ConsumeRetrier(ABC):
12
12
  @abstractmethod
13
13
  def register_retry(self, event: Event, subscribers: Sequence[MetaSubscriber]) -> None:
14
14
  pass
15
+
16
+ @abstractmethod
17
+ def clean_retries(self, event: Event, subscribers: Sequence[MetaSubscriber]) -> None:
18
+ pass
@@ -17,3 +17,7 @@ class ConsumedEventRetryRepository(ABC):
17
17
  self, event: Event, subscribers: Sequence[MetaSubscriber]
18
18
  ) -> ConsumedEventRetry:
19
19
  pass
20
+
21
+ @abstractmethod
22
+ def clean(self, event: Event, subscribers: Sequence[MetaSubscriber]) -> None:
23
+ pass
@@ -35,3 +35,6 @@ class MaxRetriesConsumeRetrier(ConsumeRetrier):
35
35
  )
36
36
  consumed_event_retry.register_retry()
37
37
  self.__consumed_event_retry_repository.save(consumed_event_retry)
38
+
39
+ def clean_retries(self, event: Event, subscribers: Sequence[MetaSubscriber]) -> None:
40
+ self.__consumed_event_retry_repository.clean(event, subscribers)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buz
3
- Version: 2.15.2
3
+ Version: 2.15.4
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
@@ -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=wJ7hxf5k1YWOkUpkUSmMMWrXLTCt94-QHkIRDfM5YuI,5566
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=S9ECzWpUQm7YKEtOFuzZMZvRVaiAMyMVfNksJ7Jno9A,5600
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
@@ -103,10 +104,10 @@ buz/event/strategies/execution_strategy/cyclic_iterator_execution_strategy.py,sh
103
104
  buz/event/strategies/execution_strategy/execution_strategy.py,sha256=sbr4N8Q19lWLrafh0obLitn8dJ-SahXgSV8aMKEP_LM,192
104
105
  buz/event/strategies/execution_strategy/self_process_execution_strategy.py,sha256=fE3qRF_nHAkiDXltKloj06--DPKpiZQcvNBVw1u-Hmo,385
105
106
  buz/event/strategies/retry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
- buz/event/strategies/retry/consume_retrier.py,sha256=DE8zxK5eSiimozq3tcRhOjZHjGM6nUKUIc0ygBtQcyg,421
107
+ buz/event/strategies/retry/consume_retrier.py,sha256=aXVXGahKBBRAuxz-24TTcRFR9_0aZGOO8bVBvujsmpw,545
107
108
  buz/event/strategies/retry/consumed_event_retry.py,sha256=sjRoSymBexiGTgh6g8V5ThzTCHiyrvE3WlMEFqcNZfY,205
108
- buz/event/strategies/retry/consumed_event_retry_repository.py,sha256=2LP2qEdrT69yVRGpBWQCCXQHWUobHPxUkShnzkLzTMQ,543
109
- buz/event/strategies/retry/max_retries_consume_retrier.py,sha256=6D5g5yknHFXAxpanisaIN8Rm8DECQbNhqPPRUeKI5G8,1579
109
+ buz/event/strategies/retry/consumed_event_retry_repository.py,sha256=Udls0pJEEXuizGG1-aGhnJ8RArD82MGOPU70Cizk1QI,659
110
+ buz/event/strategies/retry/max_retries_consume_retrier.py,sha256=hY-DrAI8MRZKDUHraY2nSsQHcUo50jzLwBZrmvN3L5I,1743
110
111
  buz/event/strategies/retry/max_retries_negative_exception.py,sha256=UdM5T4cxRv_at9GmNZXaE7Lcf6zX6jd7uaUAkBD9qvU,230
111
112
  buz/event/strategies/retry/reject_callback.py,sha256=TnmUt0AkB2DEQMieec9TtB7IAkRHdFAFepAclbiCRns,316
112
113
  buz/event/subscriber.py,sha256=WxppO8PFP5zO-gwLZNg1DKSY_uFdsF8JgWIJa6nTTds,237
@@ -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.2.dist-info/LICENSE,sha256=Jytu2S-2SPEgsB0y6BF-_LUxIWY7402fl0JSh36TLZE,1062
253
- buz-2.15.2.dist-info/METADATA,sha256=vJLWjCrVTn6AdIIQ1IJZv3jUlrPg0Kfp4O05HCaggMc,1659
254
- buz-2.15.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
255
- buz-2.15.2.dist-info/RECORD,,
253
+ buz-2.15.4.dist-info/LICENSE,sha256=Jytu2S-2SPEgsB0y6BF-_LUxIWY7402fl0JSh36TLZE,1062
254
+ buz-2.15.4.dist-info/METADATA,sha256=Bmkw2uK83S8-3WW0oRhfpqlmofc98Zw0n1ipjyGTwr0,1659
255
+ buz-2.15.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
256
+ buz-2.15.4.dist-info/RECORD,,
File without changes
File without changes