Commit e41d69b1a8512e2c555fbc1a13a9d2300c8a0916
Committed by
Andrew Shvayka
1 parent
6824e1c3
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.)
Showing
6 changed files
with
28 additions
and
5 deletions
... | ... | @@ -216,6 +216,11 @@ public class DefaultSubscriptionManagerService implements SubscriptionManagerSer |
216 | 216 | |
217 | 217 | @Override |
218 | 218 | public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback) { |
219 | + onAttributesUpdate(tenantId, entityId, scope, attributes, callback, true); | |
220 | + } | |
221 | + | |
222 | + @Override | |
223 | + public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback, boolean notifyDevice) { | |
219 | 224 | onLocalSubUpdate(entityId, |
220 | 225 | s -> { |
221 | 226 | if (TbSubscriptionType.ATTRIBUTES.equals(s.getType())) { |
... | ... | @@ -244,7 +249,7 @@ public class DefaultSubscriptionManagerService implements SubscriptionManagerSer |
244 | 249 | deviceStateService.onDeviceInactivityTimeoutUpdate(new DeviceId(entityId.getId()), attribute.getLongValue().orElse(0L)); |
245 | 250 | } |
246 | 251 | } |
247 | - } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope)) { | |
252 | + } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope) && notifyDevice) { | |
248 | 253 | clusterService.pushMsgToCore(DeviceAttributesEventNotificationMsg.onUpdate(tenantId, |
249 | 254 | new DeviceId(entityId.getId()), DataConstants.SHARED_SCOPE, new ArrayList<>(attributes)) |
250 | 255 | , null); | ... | ... |
... | ... | @@ -35,4 +35,6 @@ public interface SubscriptionManagerService extends ApplicationListener<Partitio |
35 | 35 | |
36 | 36 | void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback); |
37 | 37 | |
38 | + void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, TbCallback callback, boolean notifyDevice); | |
39 | + | |
38 | 40 | } | ... | ... |
... | ... | @@ -128,9 +128,14 @@ public class DefaultTelemetrySubscriptionService implements TelemetrySubscriptio |
128 | 128 | |
129 | 129 | @Override |
130 | 130 | public void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback) { |
131 | + saveAndNotify(tenantId, entityId, scope, attributes, callback, true); | |
132 | + } | |
133 | + | |
134 | + @Override | |
135 | + public void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback, boolean notifyDevice) { | |
131 | 136 | ListenableFuture<List<Void>> saveFuture = attrService.save(tenantId, entityId, scope, attributes); |
132 | 137 | addMainCallback(saveFuture, callback); |
133 | - addWsCallback(saveFuture, success -> onAttributesUpdate(tenantId, entityId, scope, attributes)); | |
138 | + addWsCallback(saveFuture, success -> onAttributesUpdate(tenantId, entityId, scope, attributes, notifyDevice)); | |
134 | 139 | } |
135 | 140 | |
136 | 141 | @Override |
... | ... | @@ -157,11 +162,11 @@ public class DefaultTelemetrySubscriptionService implements TelemetrySubscriptio |
157 | 162 | , System.currentTimeMillis())), callback); |
158 | 163 | } |
159 | 164 | |
160 | - private void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes) { | |
165 | + private void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, boolean notifyDevice) { | |
161 | 166 | TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, tenantId, entityId); |
162 | 167 | if (currentPartitions.contains(tpi)) { |
163 | 168 | if (subscriptionManagerService.isPresent()) { |
164 | - subscriptionManagerService.get().onAttributesUpdate(tenantId, entityId, scope, attributes, TbCallback.EMPTY); | |
169 | + subscriptionManagerService.get().onAttributesUpdate(tenantId, entityId, scope, attributes, TbCallback.EMPTY, notifyDevice); | |
165 | 170 | } else { |
166 | 171 | log.warn("Possible misconfiguration because subscriptionManagerService is null!"); |
167 | 172 | } | ... | ... |
... | ... | @@ -298,6 +298,7 @@ public class DefaultTransportService implements TransportService { |
298 | 298 | TbMsgMetaData metaData = new TbMsgMetaData(); |
299 | 299 | metaData.putValue("deviceName", sessionInfo.getDeviceName()); |
300 | 300 | metaData.putValue("deviceType", sessionInfo.getDeviceType()); |
301 | + metaData.putValue("notifyDevice", "false"); | |
301 | 302 | TbMsg tbMsg = TbMsg.newMsg(SessionMsgType.POST_ATTRIBUTES_REQUEST.name(), deviceId, metaData, gson.toJson(json)); |
302 | 303 | sendToRuleEngine(tenantId, tbMsg, new TransportTbQueueCallback(callback)); |
303 | 304 | } | ... | ... |
... | ... | @@ -36,6 +36,8 @@ public interface RuleEngineTelemetryService { |
36 | 36 | |
37 | 37 | void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback); |
38 | 38 | |
39 | + void saveAndNotify(TenantId tenantId, EntityId entityId, String scope, List<AttributeKvEntry> attributes, FutureCallback<Void> callback, boolean notifyDevice); | |
40 | + | |
39 | 41 | void saveAttrAndNotify(TenantId tenantId, EntityId entityId, String scope, String key, long value, FutureCallback<Void> callback); |
40 | 42 | |
41 | 43 | 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; |
17 | 17 | |
18 | 18 | import com.google.gson.JsonParser; |
19 | 19 | import lombok.extern.slf4j.Slf4j; |
20 | +import org.apache.commons.lang3.StringUtils; | |
20 | 21 | import org.thingsboard.rule.engine.api.RuleNode; |
21 | 22 | import org.thingsboard.rule.engine.api.TbContext; |
22 | 23 | import org.thingsboard.rule.engine.api.TbNode; |
... | ... | @@ -63,7 +64,14 @@ public class TbMsgAttributesNode implements TbNode { |
63 | 64 | } |
64 | 65 | String src = msg.getData(); |
65 | 66 | Set<AttributeKvEntry> attributes = JsonConverter.convertToAttributes(new JsonParser().parse(src)); |
66 | - ctx.getTelemetryService().saveAndNotify(ctx.getTenantId(), msg.getOriginator(), config.getScope(), new ArrayList<>(attributes), new TelemetryNodeCallback(ctx, msg)); | |
67 | + String notifyDeviceStr = msg.getMetaData().getValue("notifyDevice"); | |
68 | + ctx.getTelemetryService().saveAndNotify( | |
69 | + ctx.getTenantId(), | |
70 | + msg.getOriginator(), | |
71 | + config.getScope(), | |
72 | + new ArrayList<>(attributes), | |
73 | + new TelemetryNodeCallback(ctx, msg), | |
74 | + StringUtils.isEmpty(notifyDeviceStr) || !notifyDeviceStr.equals("false")); | |
67 | 75 | } |
68 | 76 | |
69 | 77 | @Override | ... | ... |