|
1 | | -import contextlib |
2 | 1 | import logging |
3 | | -from typing import cast |
4 | 2 |
|
5 | 3 | import distributed |
6 | 4 | from models_library.rabbitmq_messages import RabbitMessageBase |
7 | | -from servicelib.logging_utils import log_catch |
8 | 5 | from servicelib.rabbitmq import RabbitMQClient, wait_till_rabbitmq_responsive |
9 | 6 | from settings_library.rabbit import RabbitSettings |
10 | 7 |
|
11 | 8 | from .errors import ConfigurationError |
12 | 9 |
|
13 | | -logger = logging.getLogger(__name__) |
| 10 | +_logger = logging.getLogger(__name__) |
14 | 11 |
|
15 | 12 |
|
16 | | -async def on_startup( |
17 | | - worker: distributed.Worker, rabbit_settings: RabbitSettings |
18 | | -) -> None: |
19 | | - worker.rabbitmq_client = None |
20 | | - settings: RabbitSettings | None = rabbit_settings |
21 | | - if not settings: |
22 | | - logger.warning("Rabbit MQ client is de-activated in the settings") |
23 | | - return |
24 | | - await wait_till_rabbitmq_responsive(settings.dsn) |
25 | | - worker.rabbitmq_client = RabbitMQClient( |
26 | | - client_name="dask-sidecar", settings=settings |
27 | | - ) |
| 13 | +class RabbitMQPlugin(distributed.WorkerPlugin): |
| 14 | + """Dask Worker Plugin for RabbitMQ integration""" |
28 | 15 |
|
| 16 | + name = "rabbitmq_plugin" |
| 17 | + _client: RabbitMQClient | None = None |
| 18 | + _settings: RabbitSettings | None = None |
29 | 19 |
|
30 | | -async def on_shutdown(worker: distributed.Worker) -> None: |
31 | | - if worker.rabbitmq_client: |
32 | | - await worker.rabbitmq_client.close() |
| 20 | + def __init__(self, settings: RabbitSettings): |
| 21 | + self._settings = settings |
33 | 22 |
|
| 23 | + async def setup(self, worker: distributed.Worker) -> None: |
| 24 | + """Called when the plugin is attached to a worker""" |
| 25 | + _logger.info("Setting up RabbitMQ plugin") |
| 26 | + if not self._settings: |
| 27 | + _logger.warning("RabbitMQ client is de-activated (no settings provided)") |
| 28 | + return |
34 | 29 |
|
35 | | -def get_rabbitmq_client(worker: distributed.Worker) -> RabbitMQClient: |
36 | | - if not worker.rabbitmq_client: |
37 | | - raise ConfigurationError( |
38 | | - msg="RabbitMQ client is not available. Please check the configuration." |
| 30 | + await wait_till_rabbitmq_responsive(self._settings.dsn) |
| 31 | + self._client = RabbitMQClient( |
| 32 | + client_name="dask-sidecar", settings=self._settings |
39 | 33 | ) |
40 | | - return cast(RabbitMQClient, worker.rabbitmq_client) |
| 34 | + _logger.info("RabbitMQ client initialized successfully") |
41 | 35 |
|
| 36 | + async def teardown(self, worker: distributed.Worker) -> None: |
| 37 | + """Called when the worker shuts down or the plugin is removed""" |
| 38 | + _logger.info("Tearing down RabbitMQ plugin") |
| 39 | + if self._client: |
| 40 | + await self._client.close() |
| 41 | + self._client = None |
| 42 | + _logger.info("RabbitMQ client closed") |
42 | 43 |
|
43 | | -async def post_message(worker: distributed.Worker, message: RabbitMessageBase) -> None: |
44 | | - with log_catch(logger, reraise=False), contextlib.suppress(ConfigurationError): |
45 | | - # NOTE: if rabbitmq was not initialized the error does not need to flood the logs |
46 | | - await get_rabbitmq_client(worker).publish(message.channel_name, message) |
| 44 | + def get_client(self) -> RabbitMQClient: |
| 45 | + """Returns the RabbitMQ client or raises an error if not available""" |
| 46 | + if not self._client: |
| 47 | + raise ConfigurationError( |
| 48 | + msg="RabbitMQ client is not available. Please check the configuration." |
| 49 | + ) |
| 50 | + return self._client |
| 51 | + |
| 52 | + async def publish(self, channel_name: str, message: RabbitMessageBase) -> None: |
| 53 | + """Publishes a message to the specified channel""" |
| 54 | + if self._client: |
| 55 | + await self._client.publish(channel_name, message) |
| 56 | + |
| 57 | + |
| 58 | +# async def on_startup( |
| 59 | +# worker: distributed.Worker, rabbit_settings: RabbitSettings |
| 60 | +# ) -> None: |
| 61 | +# worker.rabbitmq_client = None |
| 62 | +# settings: RabbitSettings | None = rabbit_settings |
| 63 | +# if not settings: |
| 64 | +# __logger.warning("Rabbit MQ client is de-activated in the settings") |
| 65 | +# return |
| 66 | +# await wait_till_rabbitmq_responsive(settings.dsn) |
| 67 | +# worker.rabbitmq_client = RabbitMQClient( |
| 68 | +# client_name="dask-sidecar", settings=settings |
| 69 | +# ) |
| 70 | + |
| 71 | + |
| 72 | +# async def on_shutdown(worker: distributed.Worker) -> None: |
| 73 | +# if worker.rabbitmq_client: |
| 74 | +# await worker.rabbitmq_client.close() |
| 75 | + |
| 76 | + |
| 77 | +# def get_rabbitmq_client(worker: distributed.Worker) -> RabbitMQClient: |
| 78 | +# if not worker.rabbitmq_client: |
| 79 | +# raise ConfigurationError( |
| 80 | +# msg="RabbitMQ client is not available. Please check the configuration." |
| 81 | +# ) |
| 82 | +# return cast(RabbitMQClient, worker.rabbitmq_client) |
| 83 | + |
| 84 | + |
| 85 | +# async def post_message(worker: distributed.Worker, message: RabbitMessageBase) -> None: |
| 86 | +# with log_catch(__logger, reraise=False), contextlib.suppress(ConfigurationError): |
| 87 | +# # NOTE: if rabbitmq was not initialized the error does not need to flood the logs |
| 88 | +# await get_rabbitmq_client(worker).publish(message.channel_name, message) |
0 commit comments