get inactivity using entity data query instead of separate attribute fetch request
This commit is contained in:
parent
52d7da7afd
commit
3cb94532fa
@ -84,7 +84,6 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -123,7 +122,8 @@ public class DefaultDeviceStateService extends AbstractPartitionBasedService<Dev
|
|||||||
new EntityKey(EntityKeyType.TIME_SERIES, INACTIVITY_TIMEOUT),
|
new EntityKey(EntityKeyType.TIME_SERIES, INACTIVITY_TIMEOUT),
|
||||||
new EntityKey(EntityKeyType.TIME_SERIES, ACTIVITY_STATE),
|
new EntityKey(EntityKeyType.TIME_SERIES, ACTIVITY_STATE),
|
||||||
new EntityKey(EntityKeyType.TIME_SERIES, LAST_CONNECT_TIME),
|
new EntityKey(EntityKeyType.TIME_SERIES, LAST_CONNECT_TIME),
|
||||||
new EntityKey(EntityKeyType.TIME_SERIES, LAST_DISCONNECT_TIME));
|
new EntityKey(EntityKeyType.TIME_SERIES, LAST_DISCONNECT_TIME),
|
||||||
|
new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, INACTIVITY_TIMEOUT));
|
||||||
|
|
||||||
private static final List<EntityKey> PERSISTENT_ATTRIBUTE_KEYS = Arrays.asList(
|
private static final List<EntityKey> PERSISTENT_ATTRIBUTE_KEYS = Arrays.asList(
|
||||||
new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, LAST_ACTIVITY_TIME),
|
new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, LAST_ACTIVITY_TIME),
|
||||||
@ -662,24 +662,16 @@ public class DefaultDeviceStateService extends AbstractPartitionBasedService<Dev
|
|||||||
.deviceCreationTime(getEntryValue(ed, EntityKeyType.ENTITY_FIELD, "createdTime", 0L))
|
.deviceCreationTime(getEntryValue(ed, EntityKeyType.ENTITY_FIELD, "createdTime", 0L))
|
||||||
.metaData(md)
|
.metaData(md)
|
||||||
.state(deviceState).build();
|
.state(deviceState).build();
|
||||||
transformInactivityTimeout(deviceStateData);
|
transformInactivityTimeout(deviceStateData, ed);
|
||||||
return deviceStateData;
|
return deviceStateData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void transformInactivityTimeout(DeviceStateData deviceStateData) {
|
private void transformInactivityTimeout(DeviceStateData deviceStateData, EntityData ed) {
|
||||||
if (persistToTelemetry && deviceStateData.getState().getInactivityTimeout() == TimeUnit.SECONDS.toMillis(defaultInactivityTimeoutInSec)) {
|
if (persistToTelemetry && deviceStateData.getState().getInactivityTimeout() == TimeUnit.SECONDS.toMillis(defaultInactivityTimeoutInSec)) {
|
||||||
log.trace("[{}] default value for inactivity timeout fetched {}, going to fetch inactivity timeout from attributes",
|
log.trace("[{}] default value for inactivity timeout fetched {}, going to fetch inactivity timeout from attributes",
|
||||||
deviceStateData.getDeviceId(), deviceStateData.getState().getInactivityTimeout());
|
deviceStateData.getDeviceId(), deviceStateData.getState().getInactivityTimeout());
|
||||||
try {
|
long inactivityTimeout = getEntryValue(ed, EntityKeyType.SERVER_ATTRIBUTE, INACTIVITY_TIMEOUT, TimeUnit.SECONDS.toMillis(defaultInactivityTimeoutInSec));
|
||||||
Optional<AttributeKvEntry> attributeOpt = attributesService.find(TenantId.SYS_TENANT_ID, deviceStateData.getDeviceId(), SERVER_SCOPE, INACTIVITY_TIMEOUT).get();
|
deviceStateData.getState().setInactivityTimeout(inactivityTimeout);
|
||||||
attributeOpt.flatMap(KvEntry::getLongValue).ifPresent((inactivityTimeout) -> {
|
|
||||||
if (inactivityTimeout > 0) {
|
|
||||||
deviceStateData.getState().setInactivityTimeout(inactivityTimeout);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("[{}] Failed to fetch inactivity timeout from attribute", deviceStateData.getDeviceId(), e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.state;
|
package org.thingsboard.server.service.state;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.Futures;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -27,8 +26,6 @@ import org.thingsboard.server.cluster.TbClusterService;
|
|||||||
import org.thingsboard.server.common.data.DeviceIdInfo;
|
import org.thingsboard.server.common.data.DeviceIdInfo;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;
|
|
||||||
import org.thingsboard.server.common.data.kv.LongDataEntry;
|
|
||||||
import org.thingsboard.server.common.data.query.EntityData;
|
import org.thingsboard.server.common.data.query.EntityData;
|
||||||
import org.thingsboard.server.common.data.query.EntityKeyType;
|
import org.thingsboard.server.common.data.query.EntityKeyType;
|
||||||
import org.thingsboard.server.common.data.query.TsValue;
|
import org.thingsboard.server.common.data.query.TsValue;
|
||||||
@ -40,19 +37,14 @@ import org.thingsboard.server.queue.discovery.PartitionService;
|
|||||||
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.is;
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
|
||||||
import static org.mockito.BDDMockito.willReturn;
|
import static org.mockito.BDDMockito.willReturn;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
import static org.thingsboard.server.common.data.DataConstants.SERVER_SCOPE;
|
|
||||||
import static org.thingsboard.server.service.state.DefaultDeviceStateService.INACTIVITY_TIMEOUT;
|
import static org.thingsboard.server.service.state.DefaultDeviceStateService.INACTIVITY_TIMEOUT;
|
||||||
|
|
||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
@ -104,21 +96,35 @@ public class DefaultDeviceStateServiceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void givenPersistToTelemetryAndDefaultInactivityTimeoutFetched_whenTransformingToDeviceStateData_thenTryGetInactivityFromAttribute() {
|
public void givenPersistToTelemetryAndDefaultInactivityTimeoutFetched_whenTransformingToDeviceStateData_thenTryGetInactivityFromAttribute() {
|
||||||
var defaultInactivityTimeoutInSec = 60L;
|
var defaultInactivityTimeoutInSec = 60L;
|
||||||
|
var latest =
|
||||||
|
Map.of(
|
||||||
|
EntityKeyType.TIME_SERIES, Map.of(INACTIVITY_TIMEOUT, new TsValue(0, Long.toString(defaultInactivityTimeoutInSec * 1000))),
|
||||||
|
EntityKeyType.SERVER_ATTRIBUTE, Map.of(INACTIVITY_TIMEOUT, new TsValue(0, Long.toString(5000L)))
|
||||||
|
);
|
||||||
|
|
||||||
|
process(latest, defaultInactivityTimeoutInSec);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPersistToTelemetryAndNoInactivityTimeoutFetchedFromTimeSeries_whenTransformingToDeviceStateData_thenTryGetInactivityFromAttribute() {
|
||||||
|
var defaultInactivityTimeoutInSec = 60L;
|
||||||
|
var latest =
|
||||||
|
Map.of(
|
||||||
|
EntityKeyType.SERVER_ATTRIBUTE, Map.of(INACTIVITY_TIMEOUT, new TsValue(0, Long.toString(5000L)))
|
||||||
|
);
|
||||||
|
|
||||||
|
process(latest, defaultInactivityTimeoutInSec);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void process(Map<EntityKeyType, Map<String, TsValue>> latest, long defaultInactivityTimeoutInSec) {
|
||||||
service.setDefaultInactivityTimeoutInSec(defaultInactivityTimeoutInSec);
|
service.setDefaultInactivityTimeoutInSec(defaultInactivityTimeoutInSec);
|
||||||
service.setPersistToTelemetry(true);
|
service.setPersistToTelemetry(true);
|
||||||
|
|
||||||
var deviceUuid = UUID.randomUUID();
|
var deviceUuid = UUID.randomUUID();
|
||||||
var deviceId = new DeviceId(deviceUuid);
|
var deviceId = new DeviceId(deviceUuid);
|
||||||
|
|
||||||
when(attributesService.find(any(), any(), anyString(), anyString()))
|
|
||||||
.thenReturn(Futures.immediateFuture(Optional.of(new BaseAttributeKvEntry(0, new LongDataEntry(INACTIVITY_TIMEOUT, 5000L)))));
|
|
||||||
|
|
||||||
var latest =
|
|
||||||
Map.of(EntityKeyType.TIME_SERIES, Map.of(INACTIVITY_TIMEOUT, new TsValue(0, Long.toString(defaultInactivityTimeoutInSec * 1000))));
|
|
||||||
DeviceStateData deviceStateData = service.toDeviceStateData(new EntityData(deviceId, latest, Map.of()), new DeviceIdInfo(TenantId.SYS_TENANT_ID.getId(), UUID.randomUUID(), deviceUuid));
|
DeviceStateData deviceStateData = service.toDeviceStateData(new EntityData(deviceId, latest, Map.of()), new DeviceIdInfo(TenantId.SYS_TENANT_ID.getId(), UUID.randomUUID(), deviceUuid));
|
||||||
|
|
||||||
Mockito.verify(attributesService, times(1)).find(TenantId.SYS_TENANT_ID, deviceId, SERVER_SCOPE, INACTIVITY_TIMEOUT);
|
|
||||||
|
|
||||||
Assert.assertEquals(5000L, deviceStateData.getState().getInactivityTimeout());
|
Assert.assertEquals(5000L, deviceStateData.getState().getInactivityTimeout());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user