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));
|
||||
|
||||
tbClusterService.onDeviceChange(savedDevice, null);
|
||||
tbClusterService.pushMsgToCore(new DeviceNameOrTypeUpdateMsg(savedDevice.getTenantId(),
|
||||
savedDevice.getId(), savedDevice.getName(), savedDevice.getType()), null);
|
||||
tbClusterService.onEntityStateChange(savedDevice.getTenantId(), savedDevice.getId(),
|
||||
@ -150,6 +151,9 @@ public class DeviceController extends BaseController {
|
||||
Device device = checkDeviceId(deviceId, Operation.DELETE);
|
||||
deviceService.deleteDevice(getCurrentUser().getTenantId(), deviceId);
|
||||
|
||||
tbClusterService.onDeviceDeleted(device, null);
|
||||
tbClusterService.onEntityStateChange(device.getTenantId(), deviceId, ComponentLifecycleEvent.DELETED);
|
||||
|
||||
logEntityAction(deviceId, device,
|
||||
device.getCustomerId(),
|
||||
ActionType.DELETED, null, strDeviceId);
|
||||
|
||||
@ -22,6 +22,7 @@ import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
|
||||
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.EntityType;
|
||||
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.RuleChainId;
|
||||
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.msg.TbMsg;
|
||||
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);
|
||||
}
|
||||
|
||||
@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) {
|
||||
String entityName = (entity instanceof HasName) ? ((HasName) entity).getName() : entity.getClass().getName();
|
||||
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.server.common.data.ApiUsageState;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.Tenant;
|
||||
import org.thingsboard.server.common.data.TenantProfile;
|
||||
@ -66,4 +67,8 @@ public interface TbClusterService {
|
||||
void onTenantDelete(Tenant tenant, 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;
|
||||
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
|
||||
import java.util.UUID;
|
||||
@ -26,4 +27,6 @@ public interface SessionContext {
|
||||
int nextMsgId();
|
||||
|
||||
void onProfileUpdate(DeviceProfile deviceProfile);
|
||||
|
||||
void onDeviceUpdate(Device device);
|
||||
}
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package org.thingsboard.server.common.transport;
|
||||
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcResponseMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg;
|
||||
@ -40,4 +41,6 @@ public interface SessionMsgListener {
|
||||
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.server.common.data.ApiUsageRecordKey;
|
||||
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.DeviceTransportType;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
@ -643,6 +644,9 @@ public class DefaultTransportService implements TransportService {
|
||||
rateLimitService.update(apiUsageState.getTenantId(), apiUsageState.isTransportEnabled());
|
||||
//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()) {
|
||||
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) {
|
||||
return new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB());
|
||||
}
|
||||
|
||||
@ -18,12 +18,12 @@ package org.thingsboard.server.common.transport.session;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.id.DeviceId;
|
||||
import org.thingsboard.server.common.msg.session.SessionContext;
|
||||
import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceUpdate(Device device) {
|
||||
this.deviceInfo.setDeviceProfileId(device.getDeviceProfileId());
|
||||
}
|
||||
|
||||
public boolean isConnected() {
|
||||
return connected;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user