From 95752ff3b9d70da946c1fb6a6f714943b6fd73a2 Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Fri, 20 Dec 2019 15:58:55 +0200 Subject: [PATCH] Performance Improvement for Device State Service --- .../state/DefaultDeviceStateService.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java index f162d05419..0a6ce7f158 100644 --- a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java +++ b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java @@ -141,6 +141,8 @@ public class DefaultDeviceStateService implements DeviceStateService { private ListeningScheduledExecutorService queueExecutor; private ConcurrentMap> tenantDevices = new ConcurrentHashMap<>(); private ConcurrentMap deviceStates = new ConcurrentHashMap<>(); + private ConcurrentMap deviceLastReportedActivity = new ConcurrentHashMap<>(); + private ConcurrentMap deviceLastSavedActivity = new ConcurrentHashMap<>(); @PostConstruct public void init() { @@ -175,6 +177,7 @@ public class DefaultDeviceStateService implements DeviceStateService { @Override public void onDeviceActivity(DeviceId deviceId) { + deviceLastReportedActivity.put(deviceId, System.currentTimeMillis()); queueExecutor.submit(() -> onDeviceActivitySync(deviceId)); } @@ -245,6 +248,8 @@ public class DefaultDeviceStateService implements DeviceStateService { tenantDeviceSet.remove(device.getId()); } deviceStates.remove(device.getId()); + deviceLastReportedActivity.remove(device.getId()); + deviceLastSavedActivity.remove(device.getId()); } } try { @@ -305,6 +310,8 @@ public class DefaultDeviceStateService implements DeviceStateService { } else { log.debug("[{}] Device that belongs to other server is detected and removed.", deviceId); deviceStates.remove(deviceId); + deviceLastReportedActivity.remove(deviceId); + deviceLastSavedActivity.remove(deviceId); } } } @@ -330,17 +337,20 @@ public class DefaultDeviceStateService implements DeviceStateService { } private void onDeviceActivitySync(DeviceId deviceId) { - DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); - if (stateData != null) { - DeviceState state = stateData.getState(); - long ts = System.currentTimeMillis(); - stateData.getState().setLastActivityTime(ts); - pushRuleEngineMessage(stateData, ACTIVITY_EVENT); - save(deviceId, LAST_ACTIVITY_TIME, ts); - - if (!state.isActive()) { - state.setActive(true); - save(deviceId, ACTIVITY_STATE, state.isActive()); + long lastReportedActivity = deviceLastReportedActivity.getOrDefault(deviceId, 0L); + long lastSavedActivity = deviceLastSavedActivity.getOrDefault(deviceId, 0L); + if (lastReportedActivity > 0 && lastReportedActivity > lastSavedActivity) { + DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); + if (stateData != null) { + DeviceState state = stateData.getState(); + stateData.getState().setLastActivityTime(lastReportedActivity); + pushRuleEngineMessage(stateData, ACTIVITY_EVENT); + save(deviceId, LAST_ACTIVITY_TIME, lastReportedActivity); + deviceLastSavedActivity.put(deviceId, lastReportedActivity); + if (!state.isActive()) { + state.setActive(true); + save(deviceId, ACTIVITY_STATE, state.isActive()); + } } } } @@ -431,6 +441,8 @@ public class DefaultDeviceStateService implements DeviceStateService { Optional address = routingService.resolveById(deviceId); if (!address.isPresent()) { deviceStates.remove(deviceId); + deviceLastReportedActivity.remove(deviceId); + deviceLastSavedActivity.remove(deviceId); Set deviceIds = tenantDevices.get(tenantId); if (deviceIds != null) { deviceIds.remove(deviceId);