Browse Source

Added connection recovery and logging

Tuna Celik 5 years ago
parent
commit
b8af0c7490
1 changed files with 21 additions and 7 deletions
  1. 21 7
      radicale/hook/rabbitmq/__init__.py

+ 21 - 7
radicale/hook/rabbitmq/__init__.py

@@ -1,30 +1,36 @@
 import pika
 import pika
+from pika.exceptions import ChannelWrongStateError
 
 
 from radicale import hook
 from radicale import hook
 from radicale.hook import HookNotificationItem
 from radicale.hook import HookNotificationItem
+from radicale.log import logger
 
 
 
 
 class Hook(hook.BaseHook):
 class Hook(hook.BaseHook):
 
 
     def __init__(self, configuration):
     def __init__(self, configuration):
         super().__init__(configuration)
         super().__init__(configuration)
-        endpoint = configuration.get("hook", "rabbitmq_endpoint")
+        self._endpoint = configuration.get("hook", "rabbitmq_endpoint")
         self._topic = configuration.get("hook", "rabbitmq_topic")
         self._topic = configuration.get("hook", "rabbitmq_topic")
         self._encoding = configuration.get("encoding", "stock")
         self._encoding = configuration.get("encoding", "stock")
 
 
-        self._make_connection_synced(endpoint)
-        self._make_declare_queue_synced(self._topic)
+        self._make_connection_synced()
+        self._make_declare_queue_synced()
 
 
-    def _make_connection_synced(self, endpoint):
-        parameters = pika.URLParameters(endpoint)
+    def _make_connection_synced(self):
+        parameters = pika.URLParameters(self._endpoint)
         connection = pika.BlockingConnection(parameters)
         connection = pika.BlockingConnection(parameters)
         self._channel = connection.channel()
         self._channel = connection.channel()
 
 
-    def _make_declare_queue_synced(self, topic):
-        self._channel.queue_declare(queue=topic, durable=True)
+    def _make_declare_queue_synced(self):
+        self._channel.queue_declare(queue=self._topic, durable=True)
 
 
     def notify(self, notification_item):
     def notify(self, notification_item):
         if isinstance(notification_item, HookNotificationItem):
         if isinstance(notification_item, HookNotificationItem):
+            self._notify(notification_item, True)
+
+    def _notify(self, notification_item, recall):
+        try:
             self._channel.basic_publish(
             self._channel.basic_publish(
                 exchange='',
                 exchange='',
                 routing_key=self._topic,
                 routing_key=self._topic,
@@ -32,3 +38,11 @@ class Hook(hook.BaseHook):
                     encoding=self._encoding
                     encoding=self._encoding
                 )
                 )
             )
             )
+        except ChannelWrongStateError as e:
+            if recall:
+                self._make_connection_synced()
+                self._notify(notification_item, False)
+                return
+            logger.error("An exception is occurred while "
+                         "publishing hook notification item: %s",
+                         e, exc_info=True)