|
|
@ -21,11 +21,15 @@ import com.google.common.util.concurrent.ListenableFuture; |
|
|
import com.google.common.util.concurrent.SettableFuture; |
|
|
import com.google.common.util.concurrent.SettableFuture; |
|
|
import com.google.gson.Gson; |
|
|
import com.google.gson.Gson; |
|
|
import com.google.gson.JsonObject; |
|
|
import com.google.gson.JsonObject; |
|
|
|
|
|
import groovy.lang.Tuple; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
|
import org.javatuples.Pair; |
|
|
|
|
|
import org.passay.Rule; |
|
|
import org.springframework.stereotype.Component; |
|
|
import org.springframework.stereotype.Component; |
|
|
import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; |
|
|
import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; |
|
|
import org.thingsboard.server.common.data.DataConstants; |
|
|
import org.thingsboard.server.common.data.DataConstants; |
|
|
import org.thingsboard.server.common.data.Device; |
|
|
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.EntityType; |
|
|
import org.thingsboard.server.common.data.EntityView; |
|
|
import org.thingsboard.server.common.data.EntityView; |
|
|
import org.thingsboard.server.common.data.asset.Asset; |
|
|
import org.thingsboard.server.common.data.asset.Asset; |
|
|
@ -33,14 +37,18 @@ import org.thingsboard.server.common.data.id.AssetId; |
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
import org.thingsboard.server.common.data.id.DashboardId; |
|
|
import org.thingsboard.server.common.data.id.DashboardId; |
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
|
|
|
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.EntityViewId; |
|
|
import org.thingsboard.server.common.data.id.EntityViewId; |
|
|
|
|
|
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.UserId; |
|
|
import org.thingsboard.server.common.data.id.UserId; |
|
|
import org.thingsboard.server.common.data.kv.AttributeKey; |
|
|
import org.thingsboard.server.common.data.kv.AttributeKey; |
|
|
import org.thingsboard.server.common.data.kv.AttributeKvEntry; |
|
|
import org.thingsboard.server.common.data.kv.AttributeKvEntry; |
|
|
|
|
|
import org.thingsboard.server.common.data.rule.RuleChain; |
|
|
import org.thingsboard.server.common.msg.TbMsg; |
|
|
import org.thingsboard.server.common.msg.TbMsg; |
|
|
import org.thingsboard.server.common.msg.TbMsgMetaData; |
|
|
import org.thingsboard.server.common.msg.TbMsgMetaData; |
|
|
|
|
|
import org.thingsboard.server.common.msg.queue.ServiceQueue; |
|
|
import org.thingsboard.server.common.msg.session.SessionMsgType; |
|
|
import org.thingsboard.server.common.msg.session.SessionMsgType; |
|
|
import org.thingsboard.server.common.transport.adaptor.JsonConverter; |
|
|
import org.thingsboard.server.common.transport.adaptor.JsonConverter; |
|
|
import org.thingsboard.server.common.transport.util.JsonUtils; |
|
|
import org.thingsboard.server.common.transport.util.JsonUtils; |
|
|
@ -70,7 +78,9 @@ public class TelemetryProcessor extends BaseProcessor { |
|
|
List<ListenableFuture<Void>> result = new ArrayList<>(); |
|
|
List<ListenableFuture<Void>> result = new ArrayList<>(); |
|
|
EntityId entityId = constructEntityId(entityData); |
|
|
EntityId entityId = constructEntityId(entityData); |
|
|
if ((entityData.hasPostAttributesMsg() || entityData.hasPostTelemetryMsg() || entityData.hasAttributesUpdatedMsg()) && entityId != null) { |
|
|
if ((entityData.hasPostAttributesMsg() || entityData.hasPostTelemetryMsg() || entityData.hasAttributesUpdatedMsg()) && entityId != null) { |
|
|
TbMsgMetaData metaData = constructBaseMsgMetadata(tenantId, entityId); |
|
|
// TODO: voba - in terms of performance we should not fetch device from DB by id
|
|
|
|
|
|
// TbMsgMetaData metaData = constructBaseMsgMetadata(tenantId, entityId);
|
|
|
|
|
|
TbMsgMetaData metaData = new TbMsgMetaData(); |
|
|
metaData.putValue(DataConstants.MSG_SOURCE_KEY, DataConstants.EDGE_MSG_SOURCE); |
|
|
metaData.putValue(DataConstants.MSG_SOURCE_KEY, DataConstants.EDGE_MSG_SOURCE); |
|
|
if (entityData.hasPostAttributesMsg()) { |
|
|
if (entityData.hasPostAttributesMsg()) { |
|
|
result.add(processPostAttributes(tenantId, entityId, entityData.getPostAttributesMsg(), metaData)); |
|
|
result.add(processPostAttributes(tenantId, entityId, entityData.getPostAttributesMsg(), metaData)); |
|
|
@ -120,12 +130,36 @@ public class TelemetryProcessor extends BaseProcessor { |
|
|
return metaData; |
|
|
return metaData; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Pair<String, RuleChainId> getDefaultQueueNameAndRuleChainId(TenantId tenantId, EntityId entityId) { |
|
|
|
|
|
if (EntityType.DEVICE.equals(entityId.getEntityType())) { |
|
|
|
|
|
DeviceProfile deviceProfile = deviceProfileCache.get(tenantId, new DeviceId(entityId.getId())); |
|
|
|
|
|
RuleChainId ruleChainId; |
|
|
|
|
|
String queueName; |
|
|
|
|
|
|
|
|
|
|
|
if (deviceProfile == null) { |
|
|
|
|
|
log.warn("[{}] Device profile is null!", entityId); |
|
|
|
|
|
ruleChainId = null; |
|
|
|
|
|
queueName = ServiceQueue.MAIN; |
|
|
|
|
|
} else { |
|
|
|
|
|
ruleChainId = deviceProfile.getDefaultRuleChainId(); |
|
|
|
|
|
String defaultQueueName = deviceProfile.getDefaultQueueName(); |
|
|
|
|
|
queueName = defaultQueueName != null ? defaultQueueName : ServiceQueue.MAIN; |
|
|
|
|
|
} |
|
|
|
|
|
return new Pair<>(queueName, ruleChainId); |
|
|
|
|
|
} else { |
|
|
|
|
|
return new Pair<>(ServiceQueue.MAIN, null); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private ListenableFuture<Void> processPostTelemetry(TenantId tenantId, EntityId entityId, TransportProtos.PostTelemetryMsg msg, TbMsgMetaData metaData) { |
|
|
private ListenableFuture<Void> processPostTelemetry(TenantId tenantId, EntityId entityId, TransportProtos.PostTelemetryMsg msg, TbMsgMetaData metaData) { |
|
|
SettableFuture<Void> futureToSet = SettableFuture.create(); |
|
|
SettableFuture<Void> futureToSet = SettableFuture.create(); |
|
|
for (TransportProtos.TsKvListProto tsKv : msg.getTsKvListList()) { |
|
|
for (TransportProtos.TsKvListProto tsKv : msg.getTsKvListList()) { |
|
|
JsonObject json = JsonUtils.getJsonObject(tsKv.getKvList()); |
|
|
JsonObject json = JsonUtils.getJsonObject(tsKv.getKvList()); |
|
|
metaData.putValue("ts", tsKv.getTs() + ""); |
|
|
metaData.putValue("ts", tsKv.getTs() + ""); |
|
|
TbMsg tbMsg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), entityId, metaData, gson.toJson(json)); |
|
|
Pair<String, RuleChainId> defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); |
|
|
|
|
|
String queueName = defaultQueueAndRuleChain.getValue0(); |
|
|
|
|
|
RuleChainId ruleChainId = defaultQueueAndRuleChain.getValue1(); |
|
|
|
|
|
TbMsg tbMsg = TbMsg.newMsg(queueName, SessionMsgType.POST_TELEMETRY_REQUEST.name(), entityId, metaData, gson.toJson(json), ruleChainId, null); |
|
|
tbClusterService.pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { |
|
|
tbClusterService.pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { |
|
|
@Override |
|
|
@Override |
|
|
public void onSuccess(TbQueueMsgMetadata metadata) { |
|
|
public void onSuccess(TbQueueMsgMetadata metadata) { |
|
|
@ -145,7 +179,10 @@ public class TelemetryProcessor extends BaseProcessor { |
|
|
private ListenableFuture<Void> processPostAttributes(TenantId tenantId, EntityId entityId, TransportProtos.PostAttributeMsg msg, TbMsgMetaData metaData) { |
|
|
private ListenableFuture<Void> processPostAttributes(TenantId tenantId, EntityId entityId, TransportProtos.PostAttributeMsg msg, TbMsgMetaData metaData) { |
|
|
SettableFuture<Void> futureToSet = SettableFuture.create(); |
|
|
SettableFuture<Void> futureToSet = SettableFuture.create(); |
|
|
JsonObject json = JsonUtils.getJsonObject(msg.getKvList()); |
|
|
JsonObject json = JsonUtils.getJsonObject(msg.getKvList()); |
|
|
TbMsg tbMsg = TbMsg.newMsg(SessionMsgType.POST_ATTRIBUTES_REQUEST.name(), entityId, metaData, gson.toJson(json)); |
|
|
Pair<String, RuleChainId> defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); |
|
|
|
|
|
String queueName = defaultQueueAndRuleChain.getValue0(); |
|
|
|
|
|
RuleChainId ruleChainId = defaultQueueAndRuleChain.getValue1(); |
|
|
|
|
|
TbMsg tbMsg = TbMsg.newMsg(queueName, SessionMsgType.POST_ATTRIBUTES_REQUEST.name(), entityId, metaData, gson.toJson(json), ruleChainId, null); |
|
|
tbClusterService.pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { |
|
|
tbClusterService.pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { |
|
|
@Override |
|
|
@Override |
|
|
public void onSuccess(TbQueueMsgMetadata metadata) { |
|
|
public void onSuccess(TbQueueMsgMetadata metadata) { |
|
|
@ -169,7 +206,10 @@ public class TelemetryProcessor extends BaseProcessor { |
|
|
Futures.addCallback(future, new FutureCallback<List<Void>>() { |
|
|
Futures.addCallback(future, new FutureCallback<List<Void>>() { |
|
|
@Override |
|
|
@Override |
|
|
public void onSuccess(@Nullable List<Void> voids) { |
|
|
public void onSuccess(@Nullable List<Void> voids) { |
|
|
TbMsg tbMsg = TbMsg.newMsg(DataConstants.ATTRIBUTES_UPDATED, entityId, metaData, gson.toJson(json)); |
|
|
Pair<String, RuleChainId> defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); |
|
|
|
|
|
String queueName = defaultQueueAndRuleChain.getValue0(); |
|
|
|
|
|
RuleChainId ruleChainId = defaultQueueAndRuleChain.getValue1(); |
|
|
|
|
|
TbMsg tbMsg = TbMsg.newMsg(queueName, DataConstants.ATTRIBUTES_UPDATED, entityId, metaData, gson.toJson(json), ruleChainId, null); |
|
|
tbClusterService.pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { |
|
|
tbClusterService.pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { |
|
|
@Override |
|
|
@Override |
|
|
public void onSuccess(TbQueueMsgMetadata metadata) { |
|
|
public void onSuccess(TbQueueMsgMetadata metadata) { |
|
|
|