shared Attributes update improvements (If the update of the shared attributes is originated by the user's REST API call - we push it to the device, if the update arrives from the device, we will not push it back to the device by default.)
This commit is contained in:
		
							parent
							
								
									6824e1c376
								
							
						
					
					
						commit
						e41d69b1a8
					
				@ -216,6 +216,11 @@ public class DefaultSubscriptionManagerService implements SubscriptionManagerSer
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback) {
 | 
			
		||||
        onAttributesUpdate(tenantId, entityId, scope, attributes, callback, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback, boolean notifyDevice) {
 | 
			
		||||
        onLocalSubUpdate(entityId,
 | 
			
		||||
                s -> {
 | 
			
		||||
                    if (TbSubscriptionType.ATTRIBUTES.equals(s.getType())) {
 | 
			
		||||
@ -244,7 +249,7 @@ public class DefaultSubscriptionManagerService implements SubscriptionManagerSer
 | 
			
		||||
                        deviceStateService.onDeviceInactivityTimeoutUpdate(new DeviceId(entityId.getId()), attribute.getLongValue().orElse(0L));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope)) {
 | 
			
		||||
            } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope) && notifyDevice) {
 | 
			
		||||
                clusterService.pushMsgToCore(DeviceAttributesEventNotificationMsg.onUpdate(tenantId,
 | 
			
		||||
                        new DeviceId(entityId.getId()), DataConstants.SHARED_SCOPE, new ArrayList<>(attributes))
 | 
			
		||||
                        , null);
 | 
			
		||||
 | 
			
		||||
@ -35,4 +35,6 @@ public interface SubscriptionManagerService extends ApplicationListener<Partitio
 | 
			
		||||
 | 
			
		||||
    void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback);
 | 
			
		||||
 | 
			
		||||
    void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback, boolean notifyDevice);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -128,9 +128,14 @@ public class DefaultTelemetrySubscriptionService implements TelemetrySubscriptio
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback) {
 | 
			
		||||
        saveAndNotify(tenantId, entityId, scope, attributes, callback, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback, boolean notifyDevice) {
 | 
			
		||||
        ListenableFuture<List<Void>> saveFuture = attrService.save(tenantId, entityId, scope, attributes);
 | 
			
		||||
        addMainCallback(saveFuture, callback);
 | 
			
		||||
        addWsCallback(saveFuture, success -> onAttributesUpdate(tenantId, entityId, scope, attributes));
 | 
			
		||||
        addWsCallback(saveFuture, success -> onAttributesUpdate(tenantId, entityId, scope, attributes, notifyDevice));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@ -157,11 +162,11 @@ public class DefaultTelemetrySubscriptionService implements TelemetrySubscriptio
 | 
			
		||||
                , System.currentTimeMillis())), callback);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes) {
 | 
			
		||||
    private void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, boolean notifyDevice) {
 | 
			
		||||
        TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, tenantId, entityId);
 | 
			
		||||
        if (currentPartitions.contains(tpi)) {
 | 
			
		||||
            if (subscriptionManagerService.isPresent()) {
 | 
			
		||||
                subscriptionManagerService.get().onAttributesUpdate(tenantId, entityId, scope, attributes, TbCallback.EMPTY);
 | 
			
		||||
                subscriptionManagerService.get().onAttributesUpdate(tenantId, entityId, scope, attributes, TbCallback.EMPTY, notifyDevice);
 | 
			
		||||
            } else {
 | 
			
		||||
                log.warn("Possible misconfiguration because subscriptionManagerService is null!");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -298,6 +298,7 @@ public class DefaultTransportService implements TransportService {
 | 
			
		||||
            TbMsgMetaData metaData = new TbMsgMetaData();
 | 
			
		||||
            metaData.putValue("deviceName", sessionInfo.getDeviceName());
 | 
			
		||||
            metaData.putValue("deviceType", sessionInfo.getDeviceType());
 | 
			
		||||
            metaData.putValue("notifyDevice", "false");
 | 
			
		||||
            TbMsg tbMsg = TbMsg.newMsg(SessionMsgType.POST_ATTRIBUTES_REQUEST.name(), deviceId, metaData, gson.toJson(json));
 | 
			
		||||
            sendToRuleEngine(tenantId, tbMsg, new TransportTbQueueCallback(callback));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,8 @@ public interface RuleEngineTelemetryService {
 | 
			
		||||
 | 
			
		||||
    void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback);
 | 
			
		||||
 | 
			
		||||
    void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback, boolean notifyDevice);
 | 
			
		||||
 | 
			
		||||
    void saveAttrAndNotify(TenantId tenantId, EntityId entityId, String scope, String key, long value, FutureCallback<Void> callback);
 | 
			
		||||
 | 
			
		||||
    void saveAttrAndNotify(TenantId tenantId, EntityId entityId, String scope, String key, String value, FutureCallback<Void> callback);
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,7 @@ package org.thingsboard.rule.engine.telemetry;
 | 
			
		||||
 | 
			
		||||
import com.google.gson.JsonParser;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.thingsboard.rule.engine.api.RuleNode;
 | 
			
		||||
import org.thingsboard.rule.engine.api.TbContext;
 | 
			
		||||
import org.thingsboard.rule.engine.api.TbNode;
 | 
			
		||||
@ -63,7 +64,14 @@ public class TbMsgAttributesNode implements TbNode {
 | 
			
		||||
        }
 | 
			
		||||
        String src = msg.getData();
 | 
			
		||||
        Set<AttributeKvEntry> attributes = JsonConverter.convertToAttributes(new JsonParser().parse(src));
 | 
			
		||||
        ctx.getTelemetryService().saveAndNotify(ctx.getTenantId(), msg.getOriginator(), config.getScope(), new ArrayList<>(attributes), new TelemetryNodeCallback(ctx, msg));
 | 
			
		||||
        String notifyDeviceStr = msg.getMetaData().getValue("notifyDevice");
 | 
			
		||||
        ctx.getTelemetryService().saveAndNotify(
 | 
			
		||||
                ctx.getTenantId(),
 | 
			
		||||
                msg.getOriginator(),
 | 
			
		||||
                config.getScope(),
 | 
			
		||||
                new ArrayList<>(attributes),
 | 
			
		||||
                new TelemetryNodeCallback(ctx, msg),
 | 
			
		||||
                StringUtils.isEmpty(notifyDeviceStr) || !notifyDeviceStr.equals("false"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user