From a9c655b1792b38505527e389d2c2f0e29b0539ba Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Mon, 17 May 2021 10:37:14 +0300 Subject: [PATCH] default state service: update active/inactive state after fetching device on initPartition --- .../state/DefaultDeviceStateService.java | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 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 f2fdaa64d3..d7a92378f7 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 @@ -163,7 +163,7 @@ public class DefaultDeviceStateService extends TbApplicationEventListener 0 && lastReportedActivity > lastSavedActivity) { - DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); - log.trace("on Device Activity - fetched state {} for device {}", stateData, deviceId); - if (stateData != null) { - save(deviceId, LAST_ACTIVITY_TIME, lastReportedActivity); - deviceLastSavedActivity.put(deviceId, lastReportedActivity); - DeviceState state = stateData.getState(); - state.setLastActivityTime(lastReportedActivity); - if (!state.isActive()) { - state.setActive(true); - save(deviceId, ACTIVITY_STATE, state.isActive()); - pushRuleEngineMessage(stateData, ACTIVITY_EVENT); - } + final DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); + updateActivityState(deviceId, stateData, lastReportedActivity); + } + } + + void updateActivityState(DeviceId deviceId, DeviceStateData stateData, long lastReportedActivity) { + log.trace("updateActivityState - fetched state {} for device {}, lastReportedActivity {}", stateData, deviceId, lastReportedActivity); + if (stateData != null) { + save(deviceId, LAST_ACTIVITY_TIME, lastReportedActivity); + deviceLastSavedActivity.put(deviceId, lastReportedActivity); + DeviceState state = stateData.getState(); + state.setLastActivityTime(lastReportedActivity); + if (!state.isActive()) { + state.setActive(true); + save(deviceId, ACTIVITY_STATE, true); + pushRuleEngineMessage(stateData, ACTIVITY_EVENT); } + } else { + log.warn("updateActivityState - fetched state IN NULL for device {}, lastReportedActivity {}", deviceId, lastReportedActivity); } } @@ -247,7 +253,7 @@ public class DefaultDeviceStateService extends TbApplicationEventListener deviceIds = new HashSet<>(deviceStates.keySet()); for (DeviceId deviceId : deviceIds) { - updateState(ts, deviceId); + updateInactivityStateIfExpired(ts, deviceId); } } - void updateState(DeviceId deviceId) { - updateState(System.currentTimeMillis(), deviceId); + void updateInactivityStateIfExpired(long ts, DeviceId deviceId) { + DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); + updateInactivityStateIfExpired(ts, deviceId, stateData); } - void updateState(long ts, DeviceId deviceId) { - DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); + void updateInactivityStateIfExpired(long ts, DeviceId deviceId, DeviceStateData stateData) { log.trace("Processing state {} for device {}", stateData, deviceId); if (stateData != null) { DeviceState state = stateData.getState(); - state.setActive(ts < state.getLastActivityTime() + state.getInactivityTimeout()); - if (!state.isActive() && (state.getLastInactivityAlarmTime() == 0L || state.getLastInactivityAlarmTime() < state.getLastActivityTime()) && stateData.getDeviceCreationTime() + state.getInactivityTimeout() < ts) { + if (!isActive(ts, state) && (state.getLastInactivityAlarmTime() == 0L || state.getLastInactivityAlarmTime() < state.getLastActivityTime()) && stateData.getDeviceCreationTime() + state.getInactivityTimeout() < ts) { + state.setActive(false); state.setLastInactivityAlarmTime(ts); pushRuleEngineMessage(stateData, INACTIVITY_EVENT); save(deviceId, INACTIVITY_ALARM_TIME, ts); - save(deviceId, ACTIVITY_STATE, state.isActive()); + save(deviceId, ACTIVITY_STATE, false); } } else { log.debug("[{}] Device that belongs to other server is detected and removed.", deviceId); @@ -464,18 +478,29 @@ public class DefaultDeviceStateService extends TbApplicationEventListener