__init__.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import pika
  2. from pika.exceptions import ChannelWrongStateError, StreamLostError
  3. from radicale import hook
  4. from radicale.hook import HookNotificationItem
  5. from radicale.log import logger
  6. class Hook(hook.BaseHook):
  7. def __init__(self, configuration):
  8. super().__init__(configuration)
  9. self._endpoint = configuration.get("hook", "rabbitmq_endpoint")
  10. self._topic = configuration.get("hook", "rabbitmq_topic")
  11. self._queue_type = configuration.get("hook", "rabbitmq_queue_type")
  12. self._encoding = configuration.get("encoding", "stock")
  13. self._make_connection_synced()
  14. self._make_declare_queue_synced()
  15. def _make_connection_synced(self):
  16. parameters = pika.URLParameters(self._endpoint)
  17. connection = pika.BlockingConnection(parameters)
  18. self._channel = connection.channel()
  19. def _make_declare_queue_synced(self):
  20. self._channel.queue_declare(queue=self._topic, durable=True, arguments={"x-queue-type": self._queue_type})
  21. def notify(self, notification_item):
  22. if isinstance(notification_item, HookNotificationItem):
  23. self._notify(notification_item, True)
  24. def _notify(self, notification_item, recall):
  25. try:
  26. self._channel.basic_publish(
  27. exchange='',
  28. routing_key=self._topic,
  29. body=notification_item.to_json().encode(
  30. encoding=self._encoding
  31. )
  32. )
  33. except Exception as e:
  34. if (isinstance(e, ChannelWrongStateError) or
  35. isinstance(e, StreamLostError)) and recall:
  36. self._make_connection_synced()
  37. self._notify(notification_item, False)
  38. return
  39. logger.error("An exception occurred during "
  40. "publishing hook notification item: %s",
  41. e, exc_info=True)