Bug-4636: NotificationSubscriber's exception prevents notifications to other listeners
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / md / sal / dom / broker / impl / DOMNotificationRouterEvent.java
index 65c7166ac97c2eebf82e9ebaba85c17368319bcf..85f93a6238fdf8ce134474a0a04a60f5eadc0568 100644 (file)
@@ -15,12 +15,15 @@ import java.util.Collection;
 import org.opendaylight.controller.md.sal.dom.api.DOMNotification;
 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationListener;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A single notification event in the disruptor ringbuffer. These objects are reused,
  * so they do have mutable state.
  */
 final class DOMNotificationRouterEvent {
+    private static final Logger LOG = LoggerFactory.getLogger(DOMNotificationRouterEvent.class);
     public static final EventFactory<DOMNotificationRouterEvent> FACTORY = new EventFactory<DOMNotificationRouterEvent>() {
         @Override
         public DOMNotificationRouterEvent newInstance() {
@@ -45,9 +48,13 @@ final class DOMNotificationRouterEvent {
 
     void deliverNotification() {
         for (ListenerRegistration<? extends DOMNotificationListener> r : subscribers) {
-            final DOMNotificationListener l = r.getInstance();
-            if (l != null) {
-                l.onNotification(notification);
+            final DOMNotificationListener listener = r.getInstance();
+            if (listener != null) {
+                try {
+                    listener.onNotification(notification);
+                } catch (Exception e) {
+                    LOG.error("Delivery of notification {} caused an error in listener {}", notification, listener, e);
+                }
             }
         }
     }