-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #14 from olxbr/feature/hook-fail-ignore
Hook can fail without crashing all process.
- Loading branch information
Showing
4 changed files
with
91 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,39 @@ | ||
from logging import getLogger | ||
from asyncio import gather | ||
from asyncworker.rabbitmq.message import RabbitMQMessage | ||
from typing import Iterable, Callable, Optional, Any | ||
|
||
|
||
class Monitor: | ||
def __init__(self, *hooks): | ||
def __init__(self, *hooks: Iterable): | ||
self.__hooks = hooks | ||
self.__logger = getLogger('barterdude') | ||
|
||
async def dispatch_before_consume(self, message): | ||
await gather(*[hook.before_consume(message) for hook in self.__hooks]) | ||
async def _callback(self, | ||
method: Callable[[RabbitMQMessage], Optional[Any]], | ||
message: RabbitMQMessage, | ||
error: Optional[Exception] = None): | ||
try: | ||
return await (method(message, error) if error else method(message)) | ||
except Exception as e: | ||
self.__logger.warning(f"Error on hook method {method}: %s", e) | ||
|
||
async def dispatch_on_success(self, message): | ||
await gather(*[hook.on_success(message) for hook in self.__hooks]) | ||
def _prepare_callbacks(self, method_name: str, | ||
message: RabbitMQMessage, | ||
error: Optional[Exception] = None): | ||
callbacks = [] | ||
for hook in self.__hooks: | ||
callbacks.append( | ||
self._callback(getattr(hook, method_name), message, error) | ||
) | ||
return callbacks | ||
|
||
async def dispatch_on_fail(self, message, error): | ||
await gather(*[hook.on_fail(message, error) for hook in self.__hooks]) | ||
async def dispatch_before_consume(self, message: RabbitMQMessage): | ||
await gather(*self._prepare_callbacks("before_consume", message)) | ||
|
||
async def dispatch_on_success(self, message: RabbitMQMessage): | ||
await gather(*self._prepare_callbacks("on_success", message)) | ||
|
||
async def dispatch_on_fail(self, message: RabbitMQMessage, | ||
error: Exception): | ||
await gather(*self._prepare_callbacks("on_fail", message, error)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
from barterdude.hooks import BaseHook | ||
from asyncworker.rabbitmq.message import RabbitMQMessage | ||
|
||
|
||
class ErrorHook(BaseHook): | ||
async def on_success(self, message: RabbitMQMessage): | ||
raise NotImplementedError | ||
|
||
async def on_fail(self, message: RabbitMQMessage, error: Exception): | ||
raise NotImplementedError | ||
|
||
async def before_consume(self, message: RabbitMQMessage): | ||
raise NotImplementedError |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters