Moving the device event handling to separate thread

Change-Id: Idfffee1ef46fda4248839854fa2d87f3db6008bb
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
index 2b404d9..90c58b7 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
@@ -27,6 +27,7 @@
 import java.util.stream.Stream;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Streams;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -94,13 +95,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import static org.onlab.util.Tools.groupedThreads;
-
-
-import com.google.common.collect.ImmutableSet;
-
+import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 
 /**
@@ -207,6 +206,7 @@
     protected boolean dhcpFpmEnabled = false;
 
     private ScheduledExecutorService timerExecutor;
+    protected ExecutorService devEventExecutor;
 
     protected DeviceListener deviceListener = new InternalDeviceListener();
     private DhcpRelayPacketProcessor dhcpRelayPacketProcessor = new DhcpRelayPacketProcessor();
@@ -243,6 +243,9 @@
                 dhcpPollInterval,
                 TimeUnit.SECONDS);
 
+        devEventExecutor = newSingleThreadScheduledExecutor(
+                             groupedThreads("onos/dhcprelay-dev-events", "events-%d", log));
+
         modified(context);
 
         // Enable distribute route store
@@ -266,6 +269,8 @@
         compCfgService.unregisterProperties(getClass(), false);
         deviceService.removeListener(deviceListener);
         timerExecutor.shutdown();
+        devEventExecutor.shutdownNow();
+        devEventExecutor = null;
 
         log.info("DHCP-RELAY Stopped");
     }
@@ -619,16 +624,19 @@
 
         @Override
         public void event(DeviceEvent event) {
+          if (devEventExecutor != null) {
             Device device = event.subject();
             switch (event.type()) {
                 case DEVICE_ADDED:
-                    updateIgnoreVlanConfigs();
+                    devEventExecutor.execute(this::updateIgnoreVlanConfigs);
                     break;
                 case DEVICE_AVAILABILITY_CHANGED:
-                    deviceAvailabilityChanged(device);
+                    devEventExecutor.execute(() -> deviceAvailabilityChanged(device));
+                    break;
                 default:
                     break;
             }
+          }
         }
 
         private void deviceAvailabilityChanged(Device device) {