[ONOS-4789]some services don't remove listener in deactive function

Change-Id: I74c3f4eb14edcd93d06a8838a4205df381c7f678
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
index acc8ff4..49c8534 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
@@ -257,6 +257,7 @@
 
     @Deactivate
     public void deactivate() {
+        devicePortStats.removeListener(portStatsListener);
         devicePortStats.destroy();
         devicePortDeltaStats.destroy();
         executor.shutdownNow();
@@ -274,6 +275,24 @@
         devices.clear();
         devicePorts.clear();
         availableDevices.clear();
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.DEVICE_UPDATE);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.DEVICE_OFFLINE);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.DEVICE_REMOVE_REQ);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.DEVICE_REMOVED);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.PORT_UPDATE);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.DEVICE_ADVERTISE);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.DEVICE_INJECTED);
+        clusterCommunicator.removeSubscriber(
+                GossipDeviceStoreMessageSubjects.PORT_INJECTED);
         log.info("Stopped");
     }
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java b/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
index 263e93a..48a1dcc 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
@@ -90,6 +90,7 @@
 
     @Deactivate
     public void deactivate() {
+        nextGroups.removeListener(mapListener);
         tpool.shutdown();
         log.info("Stopped");
     }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java b/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
index dc8ac58..29cd8e0 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
@@ -135,11 +135,12 @@
             groupEntriesById = new ConcurrentHashMap<>();
     private ConsistentMap<GroupStoreKeyMapKey,
             StoredGroupEntry> auditPendingReqQueue = null;
+    private MapEventListener<GroupStoreKeyMapKey, StoredGroupEntry>
+            mapListener = new GroupStoreKeyMapListener();
     private final ConcurrentMap<DeviceId, ConcurrentMap<GroupId, Group>>
             extraneousGroupEntriesById = new ConcurrentHashMap<>();
     private ExecutorService messageHandlingExecutor;
     private static final int MESSAGE_HANDLER_THREAD_POOL_SIZE = 1;
-
     private final HashMap<DeviceId, Boolean> deviceAuditStatus = new HashMap<>();
 
     private final AtomicInteger groupIdGen = new AtomicInteger();
@@ -198,7 +199,7 @@
                 .withName("onos-group-store-keymap")
                 .withSerializer(serializer)
                 .build();
-        groupStoreEntriesByKey.addListener(new GroupStoreKeyMapListener());
+        groupStoreEntriesByKey.addListener(mapListener);
         log.debug("Current size of groupstorekeymap:{}",
                   groupStoreEntriesByKey.size());
 
@@ -216,6 +217,7 @@
 
     @Deactivate
     public void deactivate() {
+        groupStoreEntriesByKey.removeListener(mapListener);
         cfgService.unregisterProperties(getClass(), false);
         clusterCommunicator.removeSubscriber(GroupStoreMessageSubjects.REMOTE_GROUP_OP_REQUEST);
         log.info("Stopped");
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
index 3c42346..57a86e4 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
@@ -86,6 +86,12 @@
 
     private final AtomicLong sequenceNumber = new AtomicLong(0);
 
+    private EventuallyConsistentMapListener<Key, IntentData>
+            mapCurrentListener = new InternalCurrentListener();
+
+    private EventuallyConsistentMapListener<Key, IntentData>
+            mapPendingListener = new InternalPendingListener();
+
     @Activate
     public void activate() {
         KryoNamespace.Builder intentSerializer = KryoNamespace.newBuilder()
@@ -111,14 +117,16 @@
                 .withPeerUpdateFunction((key, intentData) -> getPeerNodes(key, intentData))
                 .build();
 
-        currentMap.addListener(new InternalCurrentListener());
-        pendingMap.addListener(new InternalPendingListener());
+        currentMap.addListener(mapCurrentListener);
+        pendingMap.addListener(mapPendingListener);
 
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate() {
+        currentMap.removeListener(mapCurrentListener);
+        pendingMap.removeListener(mapPendingListener);
         currentMap.destroy();
         pendingMap.destroy();