Ensure host events are handled outside the event loop to avoid interrupts

Change-Id: I545de9a877ca9d6d10264c4af5c199ceb69c9f3b
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
index e92cc0e..a0ea6f5 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
@@ -55,6 +55,7 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadFactory;
@@ -96,6 +97,9 @@
 
     private ThreadFactory threadFactory;
 
+    protected Executor hostEventExecutor = newSingleThreadExecutor(
+        groupedThreads("rm-event-host", "%d", log));
+
     @Activate
     protected void activate() {
         routeMonitor = new RouteMonitor(this, clusterService, storageService);
@@ -386,10 +390,12 @@
             switch (event.type()) {
             case HOST_ADDED:
             case HOST_UPDATED:
-                hostUpdated(event.subject());
+                log.trace("Scheduled host event {}", event);
+                hostEventExecutor.execute(() -> hostUpdated(event.subject()));
                 break;
             case HOST_REMOVED:
-                hostRemoved(event.subject());
+                log.trace("Scheduled host event {}", event);
+                hostEventExecutor.execute(() -> hostRemoved(event.subject()));
                 break;
             case HOST_MOVED:
                 break;