Handle device update or delete event in device's session
This commit is contained in:
parent
856555f5fa
commit
aa816d61ab
@ -118,6 +118,7 @@ public class DeviceController extends BaseController {
|
|||||||
|
|
||||||
Device savedDevice = checkNotNull(deviceService.saveDeviceWithAccessToken(device, accessToken));
|
Device savedDevice = checkNotNull(deviceService.saveDeviceWithAccessToken(device, accessToken));
|
||||||
|
|
||||||
|
tbClusterService.onDeviceChange(savedDevice, null);
|
||||||
tbClusterService.pushMsgToCore(new DeviceNameOrTypeUpdateMsg(savedDevice.getTenantId(),
|
tbClusterService.pushMsgToCore(new DeviceNameOrTypeUpdateMsg(savedDevice.getTenantId(),
|
||||||
savedDevice.getId(), savedDevice.getName(), savedDevice.getType()), null);
|
savedDevice.getId(), savedDevice.getName(), savedDevice.getType()), null);
|
||||||
tbClusterService.onEntityStateChange(savedDevice.getTenantId(), savedDevice.getId(),
|
tbClusterService.onEntityStateChange(savedDevice.getTenantId(), savedDevice.getId(),
|
||||||
@ -150,6 +151,9 @@ public class DeviceController extends BaseController {
|
|||||||
Device device = checkDeviceId(deviceId, Operation.DELETE);
|
Device device = checkDeviceId(deviceId, Operation.DELETE);
|
||||||
deviceService.deleteDevice(getCurrentUser().getTenantId(), deviceId);
|
deviceService.deleteDevice(getCurrentUser().getTenantId(), deviceId);
|
||||||
|
|
||||||
|
tbClusterService.onDeviceDeleted(device, null);
|
||||||
|
tbClusterService.onEntityStateChange(device.getTenantId(), deviceId, ComponentLifecycleEvent.DELETED);
|
||||||
|
|
||||||
logEntityAction(deviceId, device,
|
logEntityAction(deviceId, device,
|
||||||
device.getCustomerId(),
|
device.getCustomerId(),
|
||||||
ActionType.DELETED, null, strDeviceId);
|
ActionType.DELETED, null, strDeviceId);
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import org.springframework.scheduling.annotation.Scheduled;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
|
import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
|
||||||
import org.thingsboard.server.common.data.ApiUsageState;
|
import org.thingsboard.server.common.data.ApiUsageState;
|
||||||
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.HasName;
|
import org.thingsboard.server.common.data.HasName;
|
||||||
@ -32,7 +33,6 @@ import org.thingsboard.server.common.data.id.DeviceProfileId;
|
|||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
import org.thingsboard.server.common.data.id.RuleChainId;
|
import org.thingsboard.server.common.data.id.RuleChainId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.id.TenantProfileId;
|
|
||||||
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
|
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
|
||||||
import org.thingsboard.server.common.msg.TbMsg;
|
import org.thingsboard.server.common.msg.TbMsg;
|
||||||
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
|
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
|
||||||
@ -237,6 +237,16 @@ public class DefaultTbClusterService implements TbClusterService {
|
|||||||
onEntityDelete(TenantId.SYS_TENANT_ID, entity.getId(), entity.getName(), callback);
|
onEntityDelete(TenantId.SYS_TENANT_ID, entity.getId(), entity.getName(), callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDeviceChange(Device entity, TbQueueCallback callback) {
|
||||||
|
onEntityChange(entity.getTenantId(), entity.getId(), entity, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDeviceDeleted(Device entity, TbQueueCallback callback) {
|
||||||
|
onEntityDelete(entity.getTenantId(), entity.getId(), entity.getName(), callback);
|
||||||
|
}
|
||||||
|
|
||||||
public <T> void onEntityChange(TenantId tenantId, EntityId entityid, T entity, TbQueueCallback callback) {
|
public <T> void onEntityChange(TenantId tenantId, EntityId entityid, T entity, TbQueueCallback callback) {
|
||||||
String entityName = (entity instanceof HasName) ? ((HasName) entity).getName() : entity.getClass().getName();
|
String entityName = (entity instanceof HasName) ? ((HasName) entity).getName() : entity.getClass().getName();
|
||||||
log.trace("[{}][{}][{}] Processing [{}] change event", tenantId, entityid.getEntityType(), entityid.getId(), entityName);
|
log.trace("[{}][{}][{}] Processing [{}] change event", tenantId, entityid.getEntityType(), entityid.getId(), entityName);
|
||||||
|
|||||||
@ -17,6 +17,7 @@ package org.thingsboard.server.service.queue;
|
|||||||
|
|
||||||
import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
|
import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
|
||||||
import org.thingsboard.server.common.data.ApiUsageState;
|
import org.thingsboard.server.common.data.ApiUsageState;
|
||||||
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.TenantProfile;
|
import org.thingsboard.server.common.data.TenantProfile;
|
||||||
@ -66,4 +67,8 @@ public interface TbClusterService {
|
|||||||
void onTenantDelete(Tenant tenant, TbQueueCallback callback);
|
void onTenantDelete(Tenant tenant, TbQueueCallback callback);
|
||||||
|
|
||||||
void onApiStateChange(ApiUsageState apiUsageState, TbQueueCallback callback);
|
void onApiStateChange(ApiUsageState apiUsageState, TbQueueCallback callback);
|
||||||
|
|
||||||
|
void onDeviceChange(Device device, TbQueueCallback callback);
|
||||||
|
|
||||||
|
void onDeviceDeleted(Device device, TbQueueCallback callback);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.common.msg.session;
|
package org.thingsboard.server.common.msg.session;
|
||||||
|
|
||||||
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -26,4 +27,6 @@ public interface SessionContext {
|
|||||||
int nextMsgId();
|
int nextMsgId();
|
||||||
|
|
||||||
void onProfileUpdate(DeviceProfile deviceProfile);
|
void onProfileUpdate(DeviceProfile deviceProfile);
|
||||||
|
|
||||||
|
void onDeviceUpdate(Device device);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.common.transport;
|
package org.thingsboard.server.common.transport;
|
||||||
|
|
||||||
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcResponseMsg;
|
import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcResponseMsg;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg;
|
import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg;
|
||||||
@ -40,4 +41,6 @@ public interface SessionMsgListener {
|
|||||||
default void onProfileUpdate(DeviceProfile deviceProfile) {
|
default void onProfileUpdate(DeviceProfile deviceProfile) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default void onDeviceUpdate(Device device) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
||||||
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
||||||
import org.thingsboard.server.common.data.ApiUsageState;
|
import org.thingsboard.server.common.data.ApiUsageState;
|
||||||
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
@ -643,6 +644,9 @@ public class DefaultTransportService implements TransportService {
|
|||||||
rateLimitService.update(apiUsageState.getTenantId(), apiUsageState.isTransportEnabled());
|
rateLimitService.update(apiUsageState.getTenantId(), apiUsageState.isTransportEnabled());
|
||||||
//TODO: if transport is disabled, we should close all sessions and not to check credentials.
|
//TODO: if transport is disabled, we should close all sessions and not to check credentials.
|
||||||
}
|
}
|
||||||
|
} else if (EntityType.DEVICE.equals(entityType)) {
|
||||||
|
Optional<Device> deviceOpt = dataDecodingEncodingService.decode(msg.getData().toByteArray());
|
||||||
|
deviceOpt.ifPresent(this::onDeviceUpdate);
|
||||||
}
|
}
|
||||||
} else if (toSessionMsg.hasEntityDeleteMsg()) {
|
} else if (toSessionMsg.hasEntityDeleteMsg()) {
|
||||||
TransportProtos.EntityDeleteMsg msg = toSessionMsg.getEntityDeleteMsg();
|
TransportProtos.EntityDeleteMsg msg = toSessionMsg.getEntityDeleteMsg();
|
||||||
@ -675,6 +679,22 @@ public class DefaultTransportService implements TransportService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onDeviceUpdate(Device device) {
|
||||||
|
long deviceIdMSB = device.getId().getId().getMostSignificantBits();
|
||||||
|
long deviceIdLSB = device.getId().getId().getLeastSignificantBits();
|
||||||
|
sessions.forEach((id, md) -> {
|
||||||
|
if (md.getSessionInfo().getDeviceIdMSB() == deviceIdMSB
|
||||||
|
&& md.getSessionInfo().getDeviceIdLSB() == deviceIdLSB) {
|
||||||
|
long deviceProfileIdMSB = device.getDeviceProfileId().getId().getMostSignificantBits();
|
||||||
|
long deviceProfileIdLSB = device.getDeviceProfileId().getId().getLeastSignificantBits();
|
||||||
|
if (md.getSessionInfo().getDeviceProfileIdMSB() != deviceProfileIdMSB
|
||||||
|
&& md.getSessionInfo().getDeviceProfileIdLSB() != deviceProfileIdLSB) {
|
||||||
|
transportCallbackExecutor.submit(() -> md.getListener().onDeviceUpdate(device));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected UUID toSessionId(TransportProtos.SessionInfoProto sessionInfo) {
|
protected UUID toSessionId(TransportProtos.SessionInfoProto sessionInfo) {
|
||||||
return new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB());
|
return new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,12 +18,12 @@ package org.thingsboard.server.common.transport.session;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
import org.thingsboard.server.common.msg.session.SessionContext;
|
import org.thingsboard.server.common.msg.session.SessionContext;
|
||||||
import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
|
import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -65,6 +65,11 @@ public abstract class DeviceAwareSessionContext implements SessionContext {
|
|||||||
this.sessionInfo = TransportProtos.SessionInfoProto.newBuilder().mergeFrom(sessionInfo).setDeviceType(deviceProfile.getName()).build();
|
this.sessionInfo = TransportProtos.SessionInfoProto.newBuilder().mergeFrom(sessionInfo).setDeviceType(deviceProfile.getName()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDeviceUpdate(Device device) {
|
||||||
|
this.deviceInfo.setDeviceProfileId(device.getDeviceProfileId());
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
return connected;
|
return connected;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user