Browse Source

Implemented Transport support for the new rule engine

pull/725/head
Andrew Shvayka 8 years ago
parent
commit
a9b09da1e6
  1. 25
      application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
  2. 71
      application/src/main/java/org/thingsboard/server/actors/app/AppActor.java
  3. 68
      application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java
  4. 251
      application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java
  5. 38
      application/src/main/java/org/thingsboard/server/actors/device/DeviceActorToRuleEngineMsg.java
  6. 36
      application/src/main/java/org/thingsboard/server/actors/device/PendingSessionMsgData.java
  7. 36
      application/src/main/java/org/thingsboard/server/actors/device/RuleEngineQueuePutAckMsg.java
  8. 4
      application/src/main/java/org/thingsboard/server/actors/device/ToDeviceRpcRequestMetadata.java
  9. 5
      application/src/main/java/org/thingsboard/server/actors/plugin/PluginActor.java
  10. 9
      application/src/main/java/org/thingsboard/server/actors/plugin/PluginActorMessageProcessor.java
  11. 1
      application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java
  12. 11
      application/src/main/java/org/thingsboard/server/actors/plugin/SharedPluginProcessingContext.java
  13. 4
      application/src/main/java/org/thingsboard/server/actors/rpc/BasicRpcSessionListener.java
  14. 12
      application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainActor.java
  15. 19
      application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainActorMessageProcessor.java
  16. 10
      application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainManagerActor.java
  17. 4
      application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java
  18. 11
      application/src/main/java/org/thingsboard/server/actors/session/ASyncMsgProcessor.java
  19. 26
      application/src/main/java/org/thingsboard/server/actors/session/AbstractSessionActorMsgProcessor.java
  20. 4
      application/src/main/java/org/thingsboard/server/actors/session/SyncMsgProcessor.java
  21. 71
      application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java
  22. 4
      application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java
  23. 7
      application/src/main/java/org/thingsboard/server/service/cluster/rpc/ClusterGrpcService.java
  24. 6
      application/src/main/java/org/thingsboard/server/service/cluster/rpc/ClusterRpcService.java
  25. 6
      application/src/main/java/org/thingsboard/server/service/cluster/rpc/RpcMsgListener.java
  26. 4
      application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
  27. 13
      application/src/main/java/org/thingsboard/server/service/rpc/DefaultDeviceRpcService.java
  28. 3
      application/src/main/java/org/thingsboard/server/service/rpc/DeviceRpcService.java
  29. 6
      application/src/main/java/org/thingsboard/server/service/rpc/ToDeviceRpcRequestMsg.java
  30. 16
      application/src/main/resources/thingsboard.yml
  31. 44
      common/message/src/main/java/org/thingsboard/server/common/msg/MsgType.java
  32. 4
      common/message/src/main/java/org/thingsboard/server/common/msg/TbMsgMetaData.java
  33. 8
      common/message/src/main/java/org/thingsboard/server/common/msg/cluster/ClusterEventMsg.java
  34. 6
      common/message/src/main/java/org/thingsboard/server/common/msg/core/AttributesSubscribeMsg.java
  35. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/AttributesUnsubscribeMsg.java
  36. 8
      common/message/src/main/java/org/thingsboard/server/common/msg/core/AttributesUpdateNotification.java
  37. 13
      common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicCommandAckResponse.java
  38. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicGetAttributesRequest.java
  39. 11
      common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicGetAttributesResponse.java
  40. 18
      common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicResponseMsg.java
  41. 13
      common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicStatusCodeResponse.java
  42. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicTelemetryUploadRequest.java
  43. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicUpdateAttributesRequest.java
  44. 4
      common/message/src/main/java/org/thingsboard/server/common/msg/core/ResponseMsg.java
  45. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/RpcSubscribeMsg.java
  46. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/RpcUnsubscribeMsg.java
  47. 2
      common/message/src/main/java/org/thingsboard/server/common/msg/core/RuleEngineError.java
  48. 12
      common/message/src/main/java/org/thingsboard/server/common/msg/core/RuleEngineErrorMsg.java
  49. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/SessionCloseMsg.java
  50. 8
      common/message/src/main/java/org/thingsboard/server/common/msg/core/SessionCloseNotification.java
  51. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/SessionOpenMsg.java
  52. 8
      common/message/src/main/java/org/thingsboard/server/common/msg/core/ToDeviceRpcRequestMsg.java
  53. 7
      common/message/src/main/java/org/thingsboard/server/common/msg/core/ToDeviceRpcResponseMsg.java
  54. 6
      common/message/src/main/java/org/thingsboard/server/common/msg/core/ToServerRpcRequestMsg.java
  55. 8
      common/message/src/main/java/org/thingsboard/server/common/msg/core/ToServerRpcResponseMsg.java
  56. 20
      common/message/src/main/java/org/thingsboard/server/common/msg/device/BasicDeviceToDeviceActorMsg.java
  57. 5
      common/message/src/main/java/org/thingsboard/server/common/msg/device/DeviceToDeviceActorMsg.java
  58. 2
      common/message/src/main/java/org/thingsboard/server/common/msg/session/FromDeviceMsg.java
  59. 6
      common/message/src/main/java/org/thingsboard/server/common/msg/session/SessionMsgType.java
  60. 2
      common/message/src/main/java/org/thingsboard/server/common/msg/session/ToDeviceMsg.java
  61. 15
      common/message/src/main/java/org/thingsboard/server/common/msg/timeout/DeviceActorQueueTimeoutMsg.java
  62. 12
      common/message/src/main/java/org/thingsboard/server/common/msg/timeout/DeviceActorRpcTimeoutMsg.java
  63. 5
      common/message/src/main/java/org/thingsboard/server/common/msg/timeout/TimeoutMsg.java
  64. 4
      common/transport/src/main/java/org/thingsboard/server/common/transport/TransportAdaptor.java
  65. 2
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
  66. 5
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceAttributesEventNotificationMsg.java
  67. 5
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceCredentialsUpdateNotificationMsg.java
  68. 6
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java
  69. 3
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/ToDeviceActorNotificationMsg.java
  70. 2
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/AbstractPlugin.java
  71. 2
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/Plugin.java
  72. 4
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/PluginAction.java
  73. 1
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/PluginContext.java
  74. 7
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/handlers/DefaultRuleMsgHandler.java
  75. 63
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/msg/ToDeviceRpcRequestPluginMsg.java
  76. 4
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleFilter.java
  77. 6
      extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleProcessor.java
  78. 6
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/mail/SendMailAction.java
  79. 15
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/rpc/RpcPluginAction.java
  80. 6
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/rpc/ServerSideRpcCallAction.java
  81. 27
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/telemetry/TelemetryPluginAction.java
  82. 8
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java
  83. 7
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/BasicJsFilter.java
  84. 4
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilter.java
  85. 4
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTelemetryFilter.java
  86. 7
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTypeFilter.java
  87. 6
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/MethodNameFilter.java
  88. 25
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/MsgTypeFilter.java
  89. 4
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java
  90. 4
      extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java
  91. 5
      extensions/extension-kafka/src/main/java/org/thingsboard/server/extensions/kafka/action/KafkaActionPayload.java
  92. 4
      extensions/extension-kafka/src/main/java/org/thingsboard/server/extensions/kafka/action/KafkaPluginAction.java
  93. 4
      extensions/extension-mqtt/src/main/java/org/thingsboard/server/extensions/mqtt/action/MqttActionPayload.java
  94. 4
      extensions/extension-mqtt/src/main/java/org/thingsboard/server/extensions/mqtt/action/MqttPluginAction.java
  95. 4
      extensions/extension-rabbitmq/src/main/java/org/thingsboard/server/extensions/rabbitmq/action/RabbitMqActionPayload.java
  96. 4
      extensions/extension-rabbitmq/src/main/java/org/thingsboard/server/extensions/rabbitmq/action/RabbitMqPluginAction.java
  97. 5
      extensions/extension-rest-api-call/src/main/java/org/thingsboard/server/extensions/rest/action/RestApiCallActionPayload.java
  98. 4
      extensions/extension-rest-api-call/src/main/java/org/thingsboard/server/extensions/rest/action/RestApiCallPluginAction.java
  99. 4
      extensions/extension-sns/src/main/java/org/thingsboard/server/extensions/sns/action/SnsTopicActionPayload.java
  100. 4
      extensions/extension-sns/src/main/java/org/thingsboard/server/extensions/sns/action/SnsTopicPluginAction.java

25
application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java

@ -61,6 +61,7 @@ import org.thingsboard.server.service.cluster.rpc.ClusterRpcService;
import org.thingsboard.server.service.component.ComponentDiscoveryService;
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
import org.thingsboard.server.service.mail.MailExecutorService;
import org.thingsboard.server.service.rpc.DeviceRpcService;
import org.thingsboard.server.service.script.JsExecutorService;
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
@ -161,6 +162,10 @@ public class ActorSystemContext {
@Getter
private TelemetrySubscriptionService tsSubService;
@Autowired
@Getter
private DeviceRpcService deviceRpcService;
@Autowired
@Getter
@Setter
@ -186,17 +191,13 @@ public class ActorSystemContext {
@Getter
private long syncSessionTimeout;
@Value("${actors.plugin.termination.delay}")
@Getter
private long pluginActorTerminationDelay;
@Value("${actors.plugin.processing.timeout}")
@Value("${actors.queue.enabled}")
@Getter
private long pluginProcessingTimeout;
private boolean queuePersistenceEnabled;
@Value("${actors.plugin.error_persist_frequency}")
@Value("${actors.queue.timeout}")
@Getter
private long pluginErrorPersistFrequency;
private long queuePersistenceTimeout;
@Value("${actors.rule.chain.error_persist_frequency}")
@Getter
@ -206,14 +207,6 @@ public class ActorSystemContext {
@Getter
private long ruleNodeErrorPersistFrequency;
@Value("${actors.rule.termination.delay}")
@Getter
private long ruleActorTerminationDelay;
@Value("${actors.rule.error_persist_frequency}")
@Getter
private long ruleErrorPersistFrequency;
@Value("${actors.statistics.enabled}")
@Getter
private boolean statisticsEnabled;

71
application/src/main/java/org/thingsboard/server/actors/app/AppActor.java

@ -29,13 +29,12 @@ import org.thingsboard.server.actors.shared.plugin.SystemPluginManager;
import org.thingsboard.server.actors.shared.rulechain.SystemRuleChainManager;
import org.thingsboard.server.actors.tenant.TenantActor;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageDataIterable;
import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.aware.DeviceAwareMsg;
import org.thingsboard.server.common.msg.aware.TenantAwareMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg;
import org.thingsboard.server.dao.model.ModelConstants;
@ -90,12 +89,22 @@ public class AppActor extends RuleChainManagerActor {
@Override
protected boolean process(TbActorMsg msg) {
switch (msg.getMsgType()) {
case CLUSTER_EVENT_MSG:
broadcast(msg);
break;
case COMPONENT_LIFE_CYCLE_MSG:
onComponentLifecycleMsg((ComponentLifecycleMsg) msg);
break;
case SERVICE_TO_RULE_ENGINE_MSG:
onServiceToRuleEngineMsg((ServiceToRuleEngineMsg) msg);
break;
case DEVICE_SESSION_TO_DEVICE_ACTOR_MSG:
case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG:
case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG:
case DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG:
case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG:
onToDeviceActorMsg((DeviceToDeviceActorMsg) msg);
break;
default:
return false;
}
@ -110,48 +119,12 @@ public class AppActor extends RuleChainManagerActor {
}
}
// @Override
// public void onReceive(Object msg) throws Exception {
// logger.debug("Received message: {}", msg);
// if (msg instanceof ToDeviceActorMsg) {
// processDeviceMsg((ToDeviceActorMsg) msg);
// } else if (msg instanceof ToPluginActorMsg) {
// onToPluginMsg((ToPluginActorMsg) msg);
// } else if (msg instanceof ToDeviceActorNotificationMsg) {
// onToDeviceActorMsg((ToDeviceActorNotificationMsg) msg);
// } else if (msg instanceof Terminated) {
// processTermination((Terminated) msg);
// } else if (msg instanceof ClusterEventMsg) {
// broadcast(msg);
// } else if (msg instanceof ComponentLifecycleMsg) {
// onComponentLifecycleMsg((ComponentLifecycleMsg) msg);
// } else if (msg instanceof PluginTerminationMsg) {
// onPluginTerminated((PluginTerminationMsg) msg);
// } else {
// logger.warning("Unknown message: {}!", msg);
// }
// }
private void onPluginTerminated(PluginTerminationMsg msg) {
pluginManager.remove(msg.getId());
}
private void broadcast(Object msg) {
pluginManager.broadcast(msg);
@Override
protected void broadcast(Object msg) {
super.broadcast(msg);
tenantActors.values().forEach(actorRef -> actorRef.tell(msg, ActorRef.noSender()));
}
private void onToPluginMsg(ToPluginActorMsg msg) {
ActorRef target;
if (SYSTEM_TENANT.equals(msg.getPluginTenantId())) {
target = pluginManager.getOrCreateActor(this.context(), msg.getPluginId());
} else {
target = getOrCreateTenantActor(msg.getPluginTenantId());
}
target.tell(msg, ActorRef.noSender());
}
private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) {
ActorRef target;
if (SYSTEM_TENANT.equals(msg.getTenantId())) {
@ -166,17 +139,17 @@ public class AppActor extends RuleChainManagerActor {
}
}
private void onToDeviceActorMsg(ToDeviceActorNotificationMsg msg) {
private void onToDeviceActorMsg(TenantAwareMsg msg) {
getOrCreateTenantActor(msg.getTenantId()).tell(msg, ActorRef.noSender());
}
private void processDeviceMsg(ToDeviceActorMsg toDeviceActorMsg) {
TenantId tenantId = toDeviceActorMsg.getTenantId();
private void processDeviceMsg(DeviceToDeviceActorMsg deviceToDeviceActorMsg) {
TenantId tenantId = deviceToDeviceActorMsg.getTenantId();
ActorRef tenantActor = getOrCreateTenantActor(tenantId);
if (toDeviceActorMsg.getPayload().getMsgType().requiresRulesProcessing()) {
// tenantActor.tell(new RuleChainDeviceMsg(toDeviceActorMsg, ruleManager.getRuleChain(this.context())), context().self());
if (deviceToDeviceActorMsg.getPayload().getMsgType().requiresRulesProcessing()) {
// tenantActor.tell(new RuleChainDeviceMsg(deviceToDeviceActorMsg, ruleManager.getRuleChain(this.context())), context().self());
} else {
tenantActor.tell(toDeviceActorMsg, context().self());
tenantActor.tell(deviceToDeviceActorMsg, context().self());
}
}

68
application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java

@ -24,59 +24,59 @@ import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.timeout.DeviceActorQueueTimeoutMsg;
import org.thingsboard.server.common.msg.timeout.DeviceActorRpcTimeoutMsg;
import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.extensions.api.device.DeviceCredentialsUpdateNotificationMsg;
import org.thingsboard.server.extensions.api.device.DeviceNameOrTypeUpdateMsg;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.msg.TimeoutMsg;
import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestPluginMsg;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.service.rpc.ToDeviceRpcRequestMsg;
public class DeviceActor extends ContextAwareActor {
private final LoggingAdapter logger = Logging.getLogger(getContext().system(), this);
private final TenantId tenantId;
private final DeviceId deviceId;
private final DeviceActorMessageProcessor processor;
private DeviceActor(ActorSystemContext systemContext, TenantId tenantId, DeviceId deviceId) {
super(systemContext);
this.tenantId = tenantId;
this.deviceId = deviceId;
this.processor = new DeviceActorMessageProcessor(systemContext, logger, deviceId);
this.processor = new DeviceActorMessageProcessor(systemContext, logger, tenantId, deviceId);
}
@Override
protected boolean process(TbActorMsg msg) {
return false;
}
@Override
public void onReceive(Object msg) throws Exception {
// if (msg instanceof RuleChainDeviceMsg) {
// processor.process(context(), (RuleChainDeviceMsg) msg);
// } else if (msg instanceof RulesProcessedMsg) {
// processor.onRulesProcessedMsg(context(), (RulesProcessedMsg) msg);
if (msg instanceof ToDeviceActorMsg) {
processor.process(context(), (ToDeviceActorMsg) msg);
} else if (msg instanceof ToDeviceActorNotificationMsg) {
if (msg instanceof DeviceAttributesEventNotificationMsg) {
switch (msg.getMsgType()) {
case CLUSTER_EVENT_MSG:
processor.processClusterEventMsg((ClusterEventMsg) msg);
break;
case DEVICE_SESSION_TO_DEVICE_ACTOR_MSG:
processor.process(context(), (DeviceToDeviceActorMsg) msg);
break;
case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG:
processor.processAttributesUpdate(context(), (DeviceAttributesEventNotificationMsg) msg);
} else if (msg instanceof ToDeviceRpcRequestPluginMsg) {
processor.processRpcRequest(context(), (ToDeviceRpcRequestPluginMsg) msg);
} else if (msg instanceof DeviceCredentialsUpdateNotificationMsg){
break;
case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG:
processor.processCredentialsUpdate();
} else if (msg instanceof DeviceNameOrTypeUpdateMsg){
break;
case DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG:
processor.processNameOrTypeUpdate((DeviceNameOrTypeUpdateMsg) msg);
}
} else if (msg instanceof TimeoutMsg) {
processor.processTimeout(context(), (TimeoutMsg) msg);
} else if (msg instanceof ClusterEventMsg) {
processor.processClusterEventMsg((ClusterEventMsg) msg);
} else {
logger.debug("[{}][{}] Unknown msg type.", tenantId, deviceId, msg.getClass().getName());
break;
case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG:
processor.processRpcRequest(context(), (ToDeviceRpcRequestMsg) msg);
break;
case DEVICE_ACTOR_RPC_TIMEOUT_MSG:
processor.processRpcTimeout(context(), (DeviceActorRpcTimeoutMsg) msg);
break;
case DEVICE_ACTOR_QUEUE_TIMEOUT_MSG:
processor.processQueueTimeout(context(), (DeviceActorQueueTimeoutMsg) msg);
break;
case RULE_ENGINE_QUEUE_PUT_ACK_MSG:
processor.processQueueAck(context(), (RuleEngineQueuePutAckMsg) msg);
break;
default:
return false;
}
return true;
}
public static class ActorCreator extends ContextBasedCreator<DeviceActor> {

251
application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java

@ -18,31 +18,63 @@ package org.thingsboard.server.actors.device;
import akka.actor.ActorContext;
import akka.actor.ActorRef;
import akka.event.LoggingAdapter;
import com.datastax.driver.core.utils.UUIDs;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.SessionId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.AttributeKey;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.common.data.kv.KvEntry;
import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgDataType;
import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.core.*;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.core.AttributesUpdateNotification;
import org.thingsboard.server.common.msg.core.BasicCommandAckResponse;
import org.thingsboard.server.common.msg.core.BasicStatusCodeResponse;
import org.thingsboard.server.common.msg.core.BasicToDeviceSessionActorMsg;
import org.thingsboard.server.common.msg.core.RuleEngineError;
import org.thingsboard.server.common.msg.core.RuleEngineErrorMsg;
import org.thingsboard.server.common.msg.core.SessionCloseMsg;
import org.thingsboard.server.common.msg.core.SessionCloseNotification;
import org.thingsboard.server.common.msg.core.SessionOpenMsg;
import org.thingsboard.server.common.msg.core.TelemetryUploadRequest;
import org.thingsboard.server.common.msg.core.ToDeviceRpcRequestMsg;
import org.thingsboard.server.common.msg.core.ToDeviceRpcResponseMsg;
import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.kv.BasicAttributeKVMsg;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
import org.thingsboard.server.extensions.api.device.DeviceAttributes;
import org.thingsboard.server.common.msg.timeout.DeviceActorQueueTimeoutMsg;
import org.thingsboard.server.common.msg.timeout.DeviceActorRpcTimeoutMsg;
import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.extensions.api.device.DeviceNameOrTypeUpdateMsg;
import org.thingsboard.server.extensions.api.plugins.msg.*;
import java.util.*;
import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse;
import org.thingsboard.server.extensions.api.plugins.msg.RpcError;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
@ -54,25 +86,30 @@ import java.util.stream.Collectors;
*/
public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
private final TenantId tenantId;
private final DeviceId deviceId;
private final Map<SessionId, SessionInfo> sessions;
private final Map<SessionId, SessionInfo> attributeSubscriptions;
private final Map<SessionId, SessionInfo> rpcSubscriptions;
private final Map<Integer, ToDeviceRpcRequestMetadata> rpcPendingMap;
private final Map<UUID, PendingSessionMsgData> pendingMsgs;
private final Gson gson = new Gson();
private int rpcSeq = 0;
private String deviceName;
private String deviceType;
private DeviceAttributes deviceAttributes;
private TbMsgMetaData defaultMetaData;
public DeviceActorMessageProcessor(ActorSystemContext systemContext, LoggingAdapter logger, DeviceId deviceId) {
public DeviceActorMessageProcessor(ActorSystemContext systemContext, LoggingAdapter logger, TenantId tenantId, DeviceId deviceId) {
super(systemContext, logger);
this.tenantId = tenantId;
this.deviceId = deviceId;
this.sessions = new HashMap<>();
this.attributeSubscriptions = new HashMap<>();
this.rpcSubscriptions = new HashMap<>();
this.rpcPendingMap = new HashMap<>();
this.pendingMsgs = new HashMap<>();
initAttributes();
}
@ -81,19 +118,12 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
Device device = systemContext.getDeviceService().findDeviceById(deviceId);
this.deviceName = device.getName();
this.deviceType = device.getType();
this.deviceAttributes = new DeviceAttributes(fetchAttributes(DataConstants.CLIENT_SCOPE),
fetchAttributes(DataConstants.SERVER_SCOPE), fetchAttributes(DataConstants.SHARED_SCOPE));
this.defaultMetaData = new TbMsgMetaData();
this.defaultMetaData.putValue("deviceName", deviceName);
this.defaultMetaData.putValue("deviceType", deviceType);
}
private void refreshAttributes(DeviceAttributesEventNotificationMsg msg) {
if (msg.isDeleted()) {
msg.getDeletedKeys().forEach(key -> deviceAttributes.remove(key));
} else {
deviceAttributes.update(msg.getScope(), msg.getValues());
}
}
void processRpcRequest(ActorContext context, ToDeviceRpcRequestPluginMsg msg) {
void processRpcRequest(ActorContext context, org.thingsboard.server.service.rpc.ToDeviceRpcRequestMsg msg) {
ToDeviceRpcRequest request = msg.getMsg();
ToDeviceRpcRequestBody body = request.getBody();
ToDeviceRpcRequestMsg rpcRequest = new ToDeviceRpcRequestMsg(
@ -120,9 +150,8 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
syncSessionSet.forEach(rpcSubscriptions::remove);
if (request.isOneway() && sent) {
ToPluginRpcResponseDeviceMsg responsePluginMsg = toPluginRpcResponseMsg(msg, (String) null);
context.parent().tell(responsePluginMsg, ActorRef.noSender());
logger.debug("[{}] Rpc command response sent [{}]!", deviceId, request.getId());
systemContext.getDeviceRpcService().process(new FromDeviceRpcResponse(msg.getMsg().getId(), null, null));
} else {
registerPendingRpcRequest(context, msg, sent, rpcRequest, timeout);
}
@ -134,18 +163,36 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
}
private void registerPendingRpcRequest(ActorContext context, ToDeviceRpcRequestPluginMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) {
private void registerPendingRpcRequest(ActorContext context, org.thingsboard.server.service.rpc.ToDeviceRpcRequestMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) {
rpcPendingMap.put(rpcRequest.getRequestId(), new ToDeviceRpcRequestMetadata(msg, sent));
TimeoutIntMsg timeoutMsg = new TimeoutIntMsg(rpcRequest.getRequestId(), timeout);
DeviceActorRpcTimeoutMsg timeoutMsg = new DeviceActorRpcTimeoutMsg(rpcRequest.getRequestId(), timeout);
scheduleMsgWithDelay(context, timeoutMsg, timeoutMsg.getTimeout());
}
public void processTimeout(ActorContext context, TimeoutMsg msg) {
void processRpcTimeout(ActorContext context, DeviceActorRpcTimeoutMsg msg) {
ToDeviceRpcRequestMetadata requestMd = rpcPendingMap.remove(msg.getId());
if (requestMd != null) {
logger.debug("[{}] RPC request [{}] timeout detected!", deviceId, msg.getId());
ToPluginRpcResponseDeviceMsg responsePluginMsg = toPluginRpcResponseMsg(requestMd.getMsg(), requestMd.isSent() ? RpcError.TIMEOUT : RpcError.NO_ACTIVE_CONNECTION);
context.parent().tell(responsePluginMsg, ActorRef.noSender());
systemContext.getDeviceRpcService().process(new FromDeviceRpcResponse(requestMd.getMsg().getMsg().getId(),
null, requestMd.isSent() ? RpcError.TIMEOUT : RpcError.NO_ACTIVE_CONNECTION));
}
}
void processQueueTimeout(ActorContext context, DeviceActorQueueTimeoutMsg msg) {
PendingSessionMsgData data = pendingMsgs.remove(msg.getId());
if (data != null) {
logger.debug("[{}] Queue put [{}] timeout detected!", deviceId, msg.getId());
ToDeviceMsg toDeviceMsg = new RuleEngineErrorMsg(data.getSessionMsgType(), RuleEngineError.QUEUE_PUT_TIMEOUT);
sendMsgToSessionActor(new BasicToDeviceSessionActorMsg(toDeviceMsg, data.getSessionId()), data.getServerAddress());
}
}
void processQueueAck(ActorContext context, RuleEngineQueuePutAckMsg msg) {
PendingSessionMsgData data = pendingMsgs.remove(msg.getId());
if (data != null) {
logger.debug("[{}] Queue put [{}] ack detected!", deviceId, msg.getId());
ToDeviceMsg toDeviceMsg = BasicStatusCodeResponse.onSuccess(data.getSessionMsgType(), data.getRequestId());
sendMsgToSessionActor(new BasicToDeviceSessionActorMsg(toDeviceMsg, data.getSessionId()), data.getServerAddress());
}
}
@ -175,8 +222,7 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
ToDeviceRpcRequestBody body = request.getBody();
if (request.isOneway()) {
sentOneWayIds.add(entry.getKey());
ToPluginRpcResponseDeviceMsg responsePluginMsg = toPluginRpcResponseMsg(entry.getValue().getMsg(), (String) null);
context.parent().tell(responsePluginMsg, ActorRef.noSender());
systemContext.getDeviceRpcService().process(new FromDeviceRpcResponse(request.getId(), null, null));
}
ToDeviceRpcRequestMsg rpcRequest = new ToDeviceRpcRequestMsg(
entry.getKey(),
@ -188,14 +234,70 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
};
}
void process(ActorContext context, ToDeviceActorMsg msg) {
void process(ActorContext context, DeviceToDeviceActorMsg msg) {
processSubscriptionCommands(context, msg);
processRpcResponses(context, msg);
processSessionStateMsgs(msg);
SessionMsgType sessionMsgType = msg.getPayload().getMsgType();
if (sessionMsgType.requiresRulesProcessing()) {
switch (sessionMsgType) {
case GET_ATTRIBUTES_REQUEST:
handleGetAttributesRequest(msg);
break;
case POST_ATTRIBUTES_REQUEST:
break;
case POST_TELEMETRY_REQUEST:
handlePostTelemetryRequest(context, msg);
break;
case TO_SERVER_RPC_REQUEST:
break;
//TODO: push to queue and start processing!
}
}
}
private void handleGetAttributesRequest(DeviceToDeviceActorMsg msg) {
}
private void handlePostTelemetryRequest(ActorContext context, DeviceToDeviceActorMsg src) {
TelemetryUploadRequest telemetry = (TelemetryUploadRequest) src.getPayload();
Map<Long, List<KvEntry>> tsData = telemetry.getData();
JsonArray json = new JsonArray();
for (Map.Entry<Long, List<KvEntry>> entry : tsData.entrySet()) {
JsonObject ts = new JsonObject();
ts.addProperty("ts", entry.getKey());
JsonObject values = new JsonObject();
for (KvEntry kv : entry.getValue()) {
kv.getBooleanValue().ifPresent(v -> values.addProperty(kv.getKey(), v));
kv.getLongValue().ifPresent(v -> values.addProperty(kv.getKey(), v));
kv.getDoubleValue().ifPresent(v -> values.addProperty(kv.getKey(), v));
kv.getStrValue().ifPresent(v -> values.addProperty(kv.getKey(), v));
}
ts.add("values", values);
json.add(ts);
}
TbMsg tbMsg = new TbMsg(UUIDs.timeBased(), SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, defaultMetaData, TbMsgDataType.JSON, gson.toJson(json));
pushToRuleEngineWithTimeout(context, tbMsg, src, telemetry);
}
private void pushToRuleEngineWithTimeout(ActorContext context, TbMsg tbMsg, DeviceToDeviceActorMsg src, FromDeviceRequestMsg fromDeviceRequestMsg) {
SessionMsgType sessionMsgType = fromDeviceRequestMsg.getMsgType();
int requestId = fromDeviceRequestMsg.getRequestId();
if (systemContext.isQueuePersistenceEnabled()) {
pendingMsgs.put(tbMsg.getId(), new PendingSessionMsgData(src.getSessionId(), src.getServerAddress(), sessionMsgType, requestId));
scheduleMsgWithDelay(context, new DeviceActorQueueTimeoutMsg(tbMsg.getId(), systemContext.getQueuePersistenceTimeout()), systemContext.getQueuePersistenceTimeout());
} else {
ToDeviceSessionActorMsg response = new BasicToDeviceSessionActorMsg(BasicStatusCodeResponse.onSuccess(sessionMsgType, requestId), src.getSessionId());
sendMsgToSessionActor(response, src.getServerAddress());
}
context.parent().tell(new DeviceActorToRuleEngineMsg(context.self(), tbMsg), context.self());
}
void processAttributesUpdate(ActorContext context, DeviceAttributesEventNotificationMsg msg) {
refreshAttributes(msg);
if (attributeSubscriptions.size() > 0) {
ToDeviceMsg notification = null;
if (msg.isDeleted()) {
@ -225,50 +327,29 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
}
}
// void process(ActorContext context, RuleChainDeviceMsg srcMsg) {
// ChainProcessingMetaData md = new ChainProcessingMetaData(srcMsg.getRuleChain(),
// srcMsg.getToDeviceActorMsg(), new DeviceMetaData(deviceId, deviceName, deviceType, deviceAttributes), context.self());
// ChainProcessingContext ctx = new ChainProcessingContext(md);
// if (ctx.getChainLength() > 0) {
// RuleProcessingMsg msg = new RuleProcessingMsg(ctx);
// ActorRef ruleActorRef = ctx.getCurrentActor();
// ruleActorRef.tell(msg, ActorRef.noSender());
// } else {
// context.self().tell(new RulesProcessedMsg(ctx), context.self());
// }
// }
void processRpcResponses(ActorContext context, ToDeviceActorMsg msg) {
private void processRpcResponses(ActorContext context, DeviceToDeviceActorMsg msg) {
SessionId sessionId = msg.getSessionId();
FromDeviceMsg inMsg = msg.getPayload();
if (inMsg.getMsgType() == MsgType.TO_DEVICE_RPC_RESPONSE) {
if (inMsg.getMsgType() == SessionMsgType.TO_DEVICE_RPC_RESPONSE) {
logger.debug("[{}] Processing rpc command response [{}]", deviceId, sessionId);
ToDeviceRpcResponseMsg responseMsg = (ToDeviceRpcResponseMsg) inMsg;
ToDeviceRpcRequestMetadata requestMd = rpcPendingMap.remove(responseMsg.getRequestId());
boolean success = requestMd != null;
if (success) {
ToPluginRpcResponseDeviceMsg responsePluginMsg = toPluginRpcResponseMsg(requestMd.getMsg(), responseMsg.getData());
Optional<ServerAddress> pluginServerAddress = requestMd.getMsg().getServerAddress();
if (pluginServerAddress.isPresent()) {
systemContext.getRpcService().tell(pluginServerAddress.get(), responsePluginMsg);
logger.debug("[{}] Rpc command response sent to remote plugin actor [{}]!", deviceId, requestMd.getMsg().getMsg().getId());
} else {
context.parent().tell(responsePluginMsg, ActorRef.noSender());
logger.debug("[{}] Rpc command response sent to local plugin actor [{}]!", deviceId, requestMd.getMsg().getMsg().getId());
}
systemContext.getDeviceRpcService().process(new FromDeviceRpcResponse(requestMd.getMsg().getMsg().getId(), responseMsg.getData(), null));
} else {
logger.debug("[{}] Rpc command response [{}] is stale!", deviceId, responseMsg.getRequestId());
}
if (msg.getSessionType() == SessionType.SYNC) {
BasicCommandAckResponse response = success
? BasicCommandAckResponse.onSuccess(MsgType.TO_DEVICE_RPC_REQUEST, responseMsg.getRequestId())
: BasicCommandAckResponse.onError(MsgType.TO_DEVICE_RPC_REQUEST, responseMsg.getRequestId(), new TimeoutException());
? BasicCommandAckResponse.onSuccess(SessionMsgType.TO_DEVICE_RPC_REQUEST, responseMsg.getRequestId())
: BasicCommandAckResponse.onError(SessionMsgType.TO_DEVICE_RPC_REQUEST, responseMsg.getRequestId(), new TimeoutException());
sendMsgToSessionActor(new BasicToDeviceSessionActorMsg(response, msg.getSessionId()), msg.getServerAddress());
}
}
}
public void processClusterEventMsg(ClusterEventMsg msg) {
void processClusterEventMsg(ClusterEventMsg msg) {
if (!msg.isAdded()) {
logger.debug("[{}] Clearing attributes/rpc subscription for server [{}]", deviceId, msg.getServerAddress());
Predicate<Map.Entry<SessionId, SessionInfo>> filter = e -> e.getValue().getServer()
@ -278,59 +359,27 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
}
}
private ToPluginRpcResponseDeviceMsg toPluginRpcResponseMsg(ToDeviceRpcRequestPluginMsg requestMsg, String data) {
return toPluginRpcResponseMsg(requestMsg, data, null);
}
private ToPluginRpcResponseDeviceMsg toPluginRpcResponseMsg(ToDeviceRpcRequestPluginMsg requestMsg, RpcError error) {
return toPluginRpcResponseMsg(requestMsg, null, error);
}
private ToPluginRpcResponseDeviceMsg toPluginRpcResponseMsg(ToDeviceRpcRequestPluginMsg requestMsg, String data, RpcError error) {
return new ToPluginRpcResponseDeviceMsg(
requestMsg.getPluginId(),
requestMsg.getPluginTenantId(),
new FromDeviceRpcResponse(requestMsg.getMsg().getId(),
data,
error
)
);
}
// void onRulesProcessedMsg(ActorContext context, RulesProcessedMsg msg) {
// ChainProcessingContext ctx = msg.getCtx();
// ToDeviceActorMsg inMsg = ctx.getInMsg();
// SessionId sid = inMsg.getSessionId();
// ToDeviceSessionActorMsg response;
// if (ctx.getResponse() != null) {
// response = new BasicToDeviceSessionActorMsg(ctx.getResponse(), sid);
// } else {
// response = new BasicToDeviceSessionActorMsg(ctx.getError(), sid);
// }
// sendMsgToSessionActor(response, inMsg.getServerAddress());
// }
private void processSubscriptionCommands(ActorContext context, ToDeviceActorMsg msg) {
private void processSubscriptionCommands(ActorContext context, DeviceToDeviceActorMsg msg) {
SessionId sessionId = msg.getSessionId();
SessionType sessionType = msg.getSessionType();
FromDeviceMsg inMsg = msg.getPayload();
if (inMsg.getMsgType() == MsgType.SUBSCRIBE_ATTRIBUTES_REQUEST) {
if (inMsg.getMsgType() == SessionMsgType.SUBSCRIBE_ATTRIBUTES_REQUEST) {
logger.debug("[{}] Registering attributes subscription for session [{}]", deviceId, sessionId);
attributeSubscriptions.put(sessionId, new SessionInfo(sessionType, msg.getServerAddress()));
} else if (inMsg.getMsgType() == MsgType.UNSUBSCRIBE_ATTRIBUTES_REQUEST) {
} else if (inMsg.getMsgType() == SessionMsgType.UNSUBSCRIBE_ATTRIBUTES_REQUEST) {
logger.debug("[{}] Canceling attributes subscription for session [{}]", deviceId, sessionId);
attributeSubscriptions.remove(sessionId);
} else if (inMsg.getMsgType() == MsgType.SUBSCRIBE_RPC_COMMANDS_REQUEST) {
} else if (inMsg.getMsgType() == SessionMsgType.SUBSCRIBE_RPC_COMMANDS_REQUEST) {
logger.debug("[{}] Registering rpc subscription for session [{}][{}]", deviceId, sessionId, sessionType);
rpcSubscriptions.put(sessionId, new SessionInfo(sessionType, msg.getServerAddress()));
sendPendingRequests(context, sessionId, sessionType, msg.getServerAddress());
} else if (inMsg.getMsgType() == MsgType.UNSUBSCRIBE_RPC_COMMANDS_REQUEST) {
} else if (inMsg.getMsgType() == SessionMsgType.UNSUBSCRIBE_RPC_COMMANDS_REQUEST) {
logger.debug("[{}] Canceling rpc subscription for session [{}][{}]", deviceId, sessionId, sessionType);
rpcSubscriptions.remove(sessionId);
}
}
private void processSessionStateMsgs(ToDeviceActorMsg msg) {
private void processSessionStateMsgs(DeviceToDeviceActorMsg msg) {
SessionId sessionId = msg.getSessionId();
FromDeviceMsg inMsg = msg.getPayload();
if (inMsg instanceof SessionOpenMsg) {
@ -364,7 +413,7 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
}
}
public void processCredentialsUpdate() {
void processCredentialsUpdate() {
sessions.forEach((k, v) -> {
sendMsgToSessionActor(new BasicToDeviceSessionActorMsg(new SessionCloseNotification(), k), v.getServer());
});
@ -372,8 +421,12 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
rpcSubscriptions.clear();
}
public void processNameOrTypeUpdate(DeviceNameOrTypeUpdateMsg msg) {
void processNameOrTypeUpdate(DeviceNameOrTypeUpdateMsg msg) {
this.deviceName = msg.getDeviceName();
this.deviceType = msg.getDeviceType();
this.defaultMetaData = new TbMsgMetaData();
this.defaultMetaData.putValue("deviceName", deviceName);
this.defaultMetaData.putValue("deviceType", deviceType);
}
}

38
application/src/main/java/org/thingsboard/server/actors/device/DeviceActorToRuleEngineMsg.java

@ -0,0 +1,38 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.actors.device;
import akka.actor.ActorRef;
import lombok.Data;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.TbMsg;
/**
* Created by ashvayka on 15.03.18.
*/
@Data
public final class DeviceActorToRuleEngineMsg implements TbActorMsg {
private final ActorRef callbackRef;
private final TbMsg tbMsg;
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_ACTOR_TO_RULE_ENGINE_MSG;
}
}

36
application/src/main/java/org/thingsboard/server/actors/device/PendingSessionMsgData.java

@ -0,0 +1,36 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.actors.device;
import lombok.Data;
import org.thingsboard.server.common.data.id.SessionId;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.util.Optional;
/**
* Created by ashvayka on 17.04.18.
*/
@Data
public final class PendingSessionMsgData {
private final SessionId sessionId;
private final Optional<ServerAddress> serverAddress;
private final SessionMsgType sessionMsgType;
private final int requestId;
}

36
application/src/main/java/org/thingsboard/server/actors/device/RuleEngineQueuePutAckMsg.java

@ -0,0 +1,36 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.actors.device;
import lombok.Data;
import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.TbActorMsg;
import java.util.UUID;
/**
* Created by ashvayka on 15.03.18.
*/
@Data
public final class RuleEngineQueuePutAckMsg implements TbActorMsg {
private final UUID id;
@Override
public MsgType getMsgType() {
return MsgType.RULE_ENGINE_QUEUE_PUT_ACK_MSG;
}
}

4
application/src/main/java/org/thingsboard/server/actors/device/ToDeviceRpcRequestMetadata.java

@ -16,13 +16,13 @@
package org.thingsboard.server.actors.device;
import lombok.Data;
import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestPluginMsg;
import org.thingsboard.server.service.rpc.ToDeviceRpcRequestMsg;
/**
* @author Andrew Shvayka
*/
@Data
public class ToDeviceRpcRequestMetadata {
private final ToDeviceRpcRequestPluginMsg msg;
private final ToDeviceRpcRequestMsg msg;
private final boolean sent;
}

5
application/src/main/java/org/thingsboard/server/actors/plugin/PluginActor.java

@ -26,7 +26,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
import org.thingsboard.server.extensions.api.plugins.msg.TimeoutMsg;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.extensions.api.plugins.msg.ToPluginRpcResponseDeviceMsg;
import org.thingsboard.server.extensions.api.plugins.rest.PluginRestMsg;
import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg;
@ -153,6 +153,7 @@ public class PluginActor extends ComponentActor<PluginId, PluginActorMessageProc
@Override
protected long getErrorPersistFrequency() {
return systemContext.getPluginErrorPersistFrequency();
return 0;
// return systemContext.getPluginErrorPersistFrequency();
}
}

9
application/src/main/java/org/thingsboard/server/actors/plugin/PluginActorMessageProcessor.java

@ -30,13 +30,14 @@ import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.core.BasicStatusCodeResponse;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.extensions.api.plugins.Plugin;
import org.thingsboard.server.extensions.api.plugins.PluginInitializationException;
import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse;
import org.thingsboard.server.extensions.api.plugins.msg.ResponsePluginToRuleMsg;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
import org.thingsboard.server.extensions.api.plugins.msg.TimeoutMsg;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.extensions.api.plugins.rest.PluginRestMsg;
import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg;
import org.thingsboard.server.extensions.api.plugins.ws.msg.PluginWebsocketMsg;
@ -108,7 +109,7 @@ public class PluginActorMessageProcessor extends ComponentMsgProcessor<PluginId>
} catch (Exception ex) {
logger.debug("[{}] Failed to process RuleToPlugin msg: [{}] [{}]", tenantId, msg.getMsg(), ex);
RuleToPluginMsg ruleMsg = msg.getMsg();
MsgType responceMsgType = MsgType.RULE_ENGINE_ERROR;
SessionMsgType responceMsgType = SessionMsgType.RULE_ENGINE_ERROR;
Integer requestId = 0;
if (ruleMsg.getPayload() instanceof FromDeviceRequestMsg) {
requestId = ((FromDeviceRequestMsg) ruleMsg.getPayload()).getRequestId();
@ -216,7 +217,7 @@ public class PluginActorMessageProcessor extends ComponentMsgProcessor<PluginId>
@Override
public void onStop(ActorContext context) {
onStop();
scheduleMsgWithDelay(context, new PluginTerminationMsg(entityId), systemContext.getPluginActorTerminationDelay());
// scheduleMsgWithDelay(context, new PluginTerminationMsg(entityId), systemContext.getPluginActorTerminationDelay());
}
private void onStop() {

1
application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java

@ -41,6 +41,7 @@ import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.PluginApiCallSecurityContext;
import org.thingsboard.server.extensions.api.plugins.PluginCallback;

11
application/src/main/java/org/thingsboard/server/actors/plugin/SharedPluginProcessingContext.java

@ -19,10 +19,12 @@ import akka.actor.ActorRef;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.controller.plugin.PluginWebSocketMsgEndpoint;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.dao.attributes.AttributesService;
import org.thingsboard.server.dao.audit.AuditLogService;
@ -35,9 +37,6 @@ import org.thingsboard.server.dao.rule.RuleService;
import org.thingsboard.server.dao.tenant.TenantService;
import org.thingsboard.server.dao.timeseries.TimeseriesService;
import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.msg.TimeoutMsg;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestPluginMsg;
import org.thingsboard.server.service.cluster.routing.ClusterRoutingService;
import org.thingsboard.server.service.cluster.rpc.ClusterRpcService;
import scala.concurrent.duration.Duration;
@ -106,8 +105,8 @@ public final class SharedPluginProcessingContext {
public void sendRpcRequest(ToDeviceRpcRequest msg) {
log.trace("[{}] Forwarding msg {} to device actor!", pluginId, msg);
ToDeviceRpcRequestPluginMsg rpcMsg = new ToDeviceRpcRequestPluginMsg(pluginId, tenantId, msg);
forward(msg.getDeviceId(), rpcMsg, rpcService::tell);
// ToDeviceRpcRequestPluginMsg rpcMsg = new ToDeviceRpcRequestPluginMsg(pluginId, tenantId, msg);
// forward(msg.getDeviceId(), rpcMsg, rpcService::tell);
}
private <T> void forward(DeviceId deviceId, T msg, BiConsumer<ServerAddress, T> rpcFunction) {

4
application/src/main/java/org/thingsboard/server/actors/rpc/BasicRpcSessionListener.java

@ -28,7 +28,7 @@ import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg;
import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.msg.*;
@ -86,7 +86,7 @@ public class BasicRpcSessionListener implements GrpcSessionListener {
@Override
public void onToDeviceActorRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceActorRpcMessage msg) {
log.trace("{} session [{}] received device actor msg {}", getType(session), session.getRemoteServer(), msg);
service.onMsg((ToDeviceActorMsg) deserialize(msg.getData().toByteArray()));
service.onMsg((DeviceToDeviceActorMsg) deserialize(msg.getData().toByteArray()));
}
@Override

12
application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainActor.java

@ -1,12 +1,12 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -18,6 +18,7 @@ package org.thingsboard.server.actors.ruleChain;
import akka.actor.OneForOneStrategy;
import akka.actor.SupervisorStrategy;
import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.device.DeviceActorToRuleEngineMsg;
import org.thingsboard.server.actors.service.ComponentActor;
import org.thingsboard.server.actors.service.ContextBasedCreator;
import org.thingsboard.server.common.data.id.RuleChainId;
@ -44,6 +45,9 @@ public class RuleChainActor extends ComponentActor<RuleChainId, RuleChainActorMe
case SERVICE_TO_RULE_ENGINE_MSG:
processor.onServiceToRuleEngineMsg((ServiceToRuleEngineMsg) msg);
break;
case DEVICE_ACTOR_TO_RULE_ENGINE_MSG:
processor.onDeviceActorToRuleEngineMsg((DeviceActorToRuleEngineMsg) msg);
break;
case RULE_TO_RULE_CHAIN_TELL_NEXT_MSG:
processor.onTellNext((RuleNodeToRuleChainTellNextMsg) msg);
break;

19
application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainActorMessageProcessor.java

@ -1,12 +1,12 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -20,6 +20,8 @@ import akka.actor.ActorRef;
import akka.actor.Props;
import akka.event.LoggingAdapter;
import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.device.DeviceActorToRuleEngineMsg;
import org.thingsboard.server.actors.device.RuleEngineQueuePutAckMsg;
import org.thingsboard.server.actors.service.DefaultActorService;
import org.thingsboard.server.actors.shared.ComponentMsgProcessor;
import org.thingsboard.server.common.data.EntityType;
@ -157,6 +159,14 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
pushMsgToNode(firstNode, tbMsg);
}
public void onDeviceActorToRuleEngineMsg(DeviceActorToRuleEngineMsg envelope) {
checkActive();
TbMsg tbMsg = envelope.getTbMsg();
//TODO: push to queue and act on ack in async way
pushMsgToNode(firstNode, tbMsg);
envelope.getCallbackRef().tell(new RuleEngineQueuePutAckMsg(tbMsg.getId()), self);
}
void onTellNext(RuleNodeToRuleChainTellNextMsg envelope) {
checkActive();
RuleNodeId originator = envelope.getOriginator();
@ -191,5 +201,4 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
nodeCtx.getSelfActor().tell(new RuleChainToRuleNodeMsg(new DefaultTbContext(systemContext, nodeCtx), msg), self);
}
}
}

10
application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainManagerActor.java

@ -31,31 +31,29 @@ import org.thingsboard.server.dao.rule.RuleChainService;
public abstract class RuleChainManagerActor extends ContextAwareActor {
protected final RuleChainManager ruleChainManager;
protected final PluginManager pluginManager;
protected final RuleChainService ruleChainService;
public RuleChainManagerActor(ActorSystemContext systemContext, RuleChainManager ruleChainManager, PluginManager pluginManager) {
super(systemContext);
this.ruleChainManager = ruleChainManager;
this.pluginManager = pluginManager;
this.ruleChainService = systemContext.getRuleChainService();
}
protected void initRuleChains() {
pluginManager.init(this.context());
ruleChainManager.init(this.context());
}
protected ActorRef getEntityActorRef(EntityId entityId) {
ActorRef target = null;
switch (entityId.getEntityType()) {
case PLUGIN:
target = pluginManager.getOrCreateActor(this.context(), (PluginId) entityId);
break;
case RULE_CHAIN:
target = ruleChainManager.getOrCreateActor(this.context(), (RuleChainId) entityId);
break;
}
return target;
}
protected void broadcast(Object msg) {
ruleChainManager.broadcast(msg);
}
}

4
application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java

@ -39,7 +39,7 @@ import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg;
import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg;
import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg;
import org.thingsboard.server.extensions.api.device.DeviceNameOrTypeUpdateMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
import org.thingsboard.server.extensions.api.device.DeviceCredentialsUpdateNotificationMsg;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
@ -156,7 +156,7 @@ public class DefaultActorService implements ActorService {
}
@Override
public void onMsg(ToDeviceActorMsg msg) {
public void onMsg(DeviceToDeviceActorMsg msg) {
log.trace("Processing device rpc msg: {}", msg);
appActor.tell(msg, ActorRef.noSender());
}

11
application/src/main/java/org/thingsboard/server/actors/session/ASyncMsgProcessor.java

@ -22,12 +22,11 @@ import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.core.*;
import org.thingsboard.server.common.msg.core.SessionCloseMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.*;
import akka.actor.ActorContext;
import akka.event.LoggingAdapter;
import org.thingsboard.server.common.msg.session.ctrl.*;
import org.thingsboard.server.common.msg.session.ex.SessionException;
import java.util.HashMap;
@ -37,7 +36,7 @@ import java.util.Optional;
class ASyncMsgProcessor extends AbstractSessionActorMsgProcessor {
private boolean firstMsg = true;
private Map<Integer, ToDeviceActorMsg> pendingMap = new HashMap<>();
private Map<Integer, DeviceToDeviceActorMsg> pendingMap = new HashMap<>();
private Optional<ServerAddress> currentTargetServer;
private boolean subscribedToAttributeUpdates;
private boolean subscribedToRpcCommands;
@ -53,7 +52,7 @@ class ASyncMsgProcessor extends AbstractSessionActorMsgProcessor {
toDeviceMsg(new SessionOpenMsg()).ifPresent(m -> forwardToAppActor(ctx, m));
firstMsg = false;
}
ToDeviceActorMsg pendingMsg = toDeviceMsg(msg);
DeviceToDeviceActorMsg pendingMsg = toDeviceMsg(msg);
FromDeviceMsg fromDeviceMsg = pendingMsg.getPayload();
switch (fromDeviceMsg.getMsgType()) {
case POST_TELEMETRY_REQUEST:
@ -86,8 +85,8 @@ class ASyncMsgProcessor extends AbstractSessionActorMsgProcessor {
@Override
public void processToDeviceMsg(ActorContext context, ToDeviceMsg msg) {
try {
if (msg.getMsgType() != MsgType.SESSION_CLOSE) {
switch (msg.getMsgType()) {
if (msg.getSessionMsgType() != SessionMsgType.SESSION_CLOSE) {
switch (msg.getSessionMsgType()) {
case STATUS_CODE_RESPONSE:
case GET_ATTRIBUTES_RESPONSE:
ResponseMsg responseMsg = (ResponseMsg) msg;

26
application/src/main/java/org/thingsboard/server/actors/session/AbstractSessionActorMsgProcessor.java

@ -22,8 +22,8 @@ import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.SessionId;
import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.device.BasicToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.BasicDeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.*;
import org.thingsboard.server.common.msg.session.ctrl.SessionCloseMsg;
@ -37,7 +37,7 @@ abstract class AbstractSessionActorMsgProcessor extends AbstractContextAwareMsgP
protected final SessionId sessionId;
protected SessionContext sessionCtx;
protected ToDeviceActorMsg toDeviceActorMsgPrototype;
protected DeviceToDeviceActorMsg deviceToDeviceActorMsgPrototype;
protected AbstractSessionActorMsgProcessor(ActorSystemContext ctx, LoggingAdapter logger, SessionId sessionId) {
super(ctx, logger);
@ -64,29 +64,29 @@ abstract class AbstractSessionActorMsgProcessor extends AbstractContextAwareMsgP
protected void updateSessionCtx(ToDeviceActorSessionMsg msg, SessionType type) {
sessionCtx = msg.getSessionMsg().getSessionContext();
toDeviceActorMsgPrototype = new BasicToDeviceActorMsg(msg, type);
deviceToDeviceActorMsgPrototype = new BasicDeviceToDeviceActorMsg(msg, type);
}
protected ToDeviceActorMsg toDeviceMsg(ToDeviceActorSessionMsg msg) {
protected DeviceToDeviceActorMsg toDeviceMsg(ToDeviceActorSessionMsg msg) {
AdaptorToSessionActorMsg adaptorMsg = msg.getSessionMsg();
return new BasicToDeviceActorMsg(toDeviceActorMsgPrototype, adaptorMsg.getMsg());
return new BasicDeviceToDeviceActorMsg(deviceToDeviceActorMsgPrototype, adaptorMsg.getMsg());
}
protected Optional<ToDeviceActorMsg> toDeviceMsg(FromDeviceMsg msg) {
if (toDeviceActorMsgPrototype != null) {
return Optional.of(new BasicToDeviceActorMsg(toDeviceActorMsgPrototype, msg));
protected Optional<DeviceToDeviceActorMsg> toDeviceMsg(FromDeviceMsg msg) {
if (deviceToDeviceActorMsgPrototype != null) {
return Optional.of(new BasicDeviceToDeviceActorMsg(deviceToDeviceActorMsgPrototype, msg));
} else {
return Optional.empty();
}
}
protected Optional<ServerAddress> forwardToAppActor(ActorContext ctx, ToDeviceActorMsg toForward) {
protected Optional<ServerAddress> forwardToAppActor(ActorContext ctx, DeviceToDeviceActorMsg toForward) {
Optional<ServerAddress> address = systemContext.getRoutingService().resolveById(toForward.getDeviceId());
forwardToAppActor(ctx, toForward, address);
return address;
}
protected Optional<ServerAddress> forwardToAppActorIfAdressChanged(ActorContext ctx, ToDeviceActorMsg toForward, Optional<ServerAddress> oldAddress) {
protected Optional<ServerAddress> forwardToAppActorIfAdressChanged(ActorContext ctx, DeviceToDeviceActorMsg toForward, Optional<ServerAddress> oldAddress) {
Optional<ServerAddress> newAddress = systemContext.getRoutingService().resolveById(toForward.getDeviceId());
if (!newAddress.equals(oldAddress)) {
if (newAddress.isPresent()) {
@ -99,7 +99,7 @@ abstract class AbstractSessionActorMsgProcessor extends AbstractContextAwareMsgP
return newAddress;
}
protected void forwardToAppActor(ActorContext ctx, ToDeviceActorMsg toForward, Optional<ServerAddress> address) {
protected void forwardToAppActor(ActorContext ctx, DeviceToDeviceActorMsg toForward, Optional<ServerAddress> address) {
if (address.isPresent()) {
systemContext.getRpcService().tell(address.get(),
toForward.toOtherAddress(systemContext.getRoutingService().getCurrentServer()));
@ -114,6 +114,6 @@ abstract class AbstractSessionActorMsgProcessor extends AbstractContextAwareMsgP
}
public DeviceId getDeviceId() {
return toDeviceActorMsgPrototype.getDeviceId();
return deviceToDeviceActorMsgPrototype.getDeviceId();
}
}

4
application/src/main/java/org/thingsboard/server/actors/session/SyncMsgProcessor.java

@ -20,7 +20,7 @@ import org.thingsboard.server.actors.shared.SessionTimeoutMsg;
import org.thingsboard.server.common.data.id.SessionId;
import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.*;
import org.thingsboard.server.common.msg.session.ToDeviceActorSessionMsg;
import org.thingsboard.server.common.msg.session.ctrl.SessionCloseMsg;
@ -32,7 +32,7 @@ import akka.event.LoggingAdapter;
import java.util.Optional;
class SyncMsgProcessor extends AbstractSessionActorMsgProcessor {
private ToDeviceActorMsg pendingMsg;
private DeviceToDeviceActorMsg pendingMsg;
private Optional<ServerAddress> currentTargetServer;
private boolean pendingResponse;

71
application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java

@ -17,10 +17,9 @@ package org.thingsboard.server.actors.tenant;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.device.DeviceActor;
import org.thingsboard.server.actors.device.DeviceActorToRuleEngineMsg;
import org.thingsboard.server.actors.plugin.PluginTerminationMsg;
import org.thingsboard.server.actors.ruleChain.RuleChainManagerActor;
import org.thingsboard.server.actors.service.ContextBasedCreator;
@ -30,7 +29,8 @@ import org.thingsboard.server.actors.shared.rulechain.TenantRuleChainManager;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.aware.DeviceAwareMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
@ -64,63 +64,47 @@ public class TenantActor extends RuleChainManagerActor {
@Override
protected boolean process(TbActorMsg msg) {
switch (msg.getMsgType()) {
case CLUSTER_EVENT_MSG:
broadcast(msg);
break;
case COMPONENT_LIFE_CYCLE_MSG:
onComponentLifecycleMsg((ComponentLifecycleMsg) msg);
break;
case SERVICE_TO_RULE_ENGINE_MSG:
onServiceToRuleEngineMsg((ServiceToRuleEngineMsg) msg);
break;
case DEVICE_ACTOR_TO_RULE_ENGINE_MSG:
onDeviceActorToRuleEngineMsg((DeviceActorToRuleEngineMsg) msg);
break;
case DEVICE_SESSION_TO_DEVICE_ACTOR_MSG:
case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG:
case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG:
case DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG:
case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG:
onToDeviceActorMsg((DeviceToDeviceActorMsg) msg);
break;
default:
return false;
}
return true;
}
private void onServiceToRuleEngineMsg(ServiceToRuleEngineMsg msg) {
ruleChainManager.getRootChainActor().tell(msg, self());
}
// @Override
// public void onReceive(Object msg) throws Exception {
// logger.debug("[{}] Received message: {}", tenantId, msg);
// if (msg instanceof ToDeviceActorMsg) {
// onToDeviceActorMsg((ToDeviceActorMsg) msg);
// } else if (msg instanceof ToPluginActorMsg) {
// onToPluginMsg((ToPluginActorMsg) msg);
// } else if (msg instanceof ToDeviceActorNotificationMsg) {
// onToDeviceActorMsg((ToDeviceActorNotificationMsg) msg);
// } else if (msg instanceof ClusterEventMsg) {
// broadcast(msg);
// } else if (msg instanceof ComponentLifecycleMsg) {
// onComponentLifecycleMsg((ComponentLifecycleMsg) msg);
// } else if (msg instanceof PluginTerminationMsg) {
// onPluginTerminated((PluginTerminationMsg) msg);
// } else {
// logger.warning("[{}] Unknown message: {}!", tenantId, msg);
// }
// }
private void broadcast(Object msg) {
pluginManager.broadcast(msg);
@Override
protected void broadcast(Object msg) {
super.broadcast(msg);
deviceActors.values().forEach(actorRef -> actorRef.tell(msg, ActorRef.noSender()));
}
private void onToDeviceActorMsg(ToDeviceActorMsg msg) {
getOrCreateDeviceActor(msg.getDeviceId()).tell(msg, ActorRef.noSender());
private void onServiceToRuleEngineMsg(ServiceToRuleEngineMsg msg) {
ruleChainManager.getRootChainActor().tell(msg, self());
}
private void onToDeviceActorMsg(ToDeviceActorNotificationMsg msg) {
getOrCreateDeviceActor(msg.getDeviceId()).tell(msg, ActorRef.noSender());
private void onDeviceActorToRuleEngineMsg(DeviceActorToRuleEngineMsg msg) {
ruleChainManager.getRootChainActor().tell(msg, self());
}
private void onToPluginMsg(ToPluginActorMsg msg) {
if (msg.getPluginTenantId().equals(tenantId)) {
ActorRef pluginActor = pluginManager.getOrCreateActor(this.context(), msg.getPluginId());
pluginActor.tell(msg, ActorRef.noSender());
} else {
context().parent().tell(msg, ActorRef.noSender());
}
private void onToDeviceActorMsg(DeviceAwareMsg msg) {
getOrCreateDeviceActor(msg.getDeviceId()).tell(msg, ActorRef.noSender());
}
private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) {
@ -132,11 +116,6 @@ public class TenantActor extends RuleChainManagerActor {
}
}
private void onPluginTerminated(PluginTerminationMsg msg) {
pluginManager.remove(msg.getId());
}
private ActorRef getOrCreateDeviceActor(DeviceId deviceId) {
return deviceActors.computeIfAbsent(deviceId, k -> context().actorOf(Props.create(new DeviceActor.ActorCreator(systemContext, tenantId, deviceId))
.withDispatcher(DefaultActorService.CORE_DISPATCHER_NAME), deviceId.toString()));

4
application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java

@ -131,8 +131,8 @@ public class ThingsboardInstallService {
systemDataLoaderService.createSysAdmin();
systemDataLoaderService.createAdminSettings();
systemDataLoaderService.loadSystemWidgets();
systemDataLoaderService.loadSystemPlugins();
systemDataLoaderService.loadSystemRules();
// systemDataLoaderService.loadSystemPlugins();
// systemDataLoaderService.loadSystemRules();
if (loadDemo) {
log.info("Loading demo data...");

7
application/src/main/java/org/thingsboard/server/service/cluster/rpc/ClusterGrpcService.java

@ -30,11 +30,10 @@ import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg;
import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestPluginMsg;
import org.thingsboard.server.extensions.api.plugins.msg.ToPluginRpcResponseDeviceMsg;
import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg;
import org.thingsboard.server.gen.cluster.ClusterAPIProtos;
@ -119,7 +118,7 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI
}
@Override
public void tell(ServerAddress serverAddress, ToDeviceActorMsg toForward) {
public void tell(ServerAddress serverAddress, DeviceToDeviceActorMsg toForward) {
ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder()
.setToDeviceActorRpcMsg(toProtoMsg(toForward)).build();
tell(serverAddress, msg);
@ -185,7 +184,7 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI
}
}
private static ClusterAPIProtos.ToDeviceActorRpcMessage toProtoMsg(ToDeviceActorMsg msg) {
private static ClusterAPIProtos.ToDeviceActorRpcMessage toProtoMsg(DeviceToDeviceActorMsg msg) {
return ClusterAPIProtos.ToDeviceActorRpcMessage.newBuilder().setData(
ByteString.copyFrom(SerializationUtils.serialize(msg))
).build();

6
application/src/main/java/org/thingsboard/server/service/cluster/rpc/ClusterRpcService.java

@ -19,10 +19,8 @@ import io.grpc.stub.StreamObserver;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg;
import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestPluginMsg;
import org.thingsboard.server.extensions.api.plugins.msg.ToPluginRpcResponseDeviceMsg;
import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg;
import org.thingsboard.server.gen.cluster.ClusterAPIProtos;
@ -37,7 +35,7 @@ public interface ClusterRpcService {
void init(RpcMsgListener listener);
void tell(ServerAddress serverAddress, ToDeviceActorMsg toForward);
void tell(ServerAddress serverAddress, DeviceToDeviceActorMsg toForward);
void tell(ServerAddress serverAddress, ToDeviceSessionActorMsg toForward);

6
application/src/main/java/org/thingsboard/server/service/cluster/rpc/RpcMsgListener.java

@ -20,18 +20,16 @@ import org.thingsboard.server.actors.rpc.RpcSessionCreateRequestMsg;
import org.thingsboard.server.actors.rpc.RpcSessionTellMsg;
import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg;
import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.msg.ToPluginActorMsg;
import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg;
import org.thingsboard.server.gen.cluster.ClusterAPIProtos;
/**
* @author Andrew Shvayka
*/
public interface RpcMsgListener {
void onMsg(ToDeviceActorMsg msg);
void onMsg(DeviceToDeviceActorMsg msg);
void onMsg(ToDeviceActorNotificationMsg msg);

4
application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java

@ -181,7 +181,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
@Override
public void loadSystemPlugins() throws Exception {
loadPlugins(Paths.get(dataDir, JSON_DIR, SYSTEM_DIR, PLUGINS_DIR), null);
// loadPlugins(Paths.get(dataDir, JSON_DIR, SYSTEM_DIR, PLUGINS_DIR), null);
}
@ -227,7 +227,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
createDevice(demoTenant.getId(), null, DEFAULT_DEVICE_TYPE, "Raspberry Pi Demo Device", "RASPBERRY_PI_DEMO_TOKEN", "Demo device that is used in " +
"Raspberry Pi GPIO control sample application");
loadPlugins(Paths.get(dataDir, JSON_DIR, DEMO_DIR, PLUGINS_DIR), demoTenant.getId());
// loadPlugins(Paths.get(dataDir, JSON_DIR, DEMO_DIR, PLUGINS_DIR), demoTenant.getId());
// loadRules(Paths.get(dataDir, JSON_DIR, DEMO_DIR, RULES_DIR), demoTenant.getId());
loadDashboards(Paths.get(dataDir, JSON_DIR, DEMO_DIR, DASHBOARDS_DIR), demoTenant.getId(), null);
}

13
application/src/main/java/org/thingsboard/server/service/rpc/DefaultDeviceRpcService.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.service.rpc;
import akka.actor.ActorRef;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -104,8 +105,20 @@ public class DefaultDeviceRpcService implements DeviceRpcService {
}, timeout, TimeUnit.MILLISECONDS);
}
@Override
public void process(ToDeviceRpcRequest request, ServerAddress originator) {
// if (pluginServerAddress.isPresent()) {
// systemContext.getRpcService().tell(pluginServerAddress.get(), responsePluginMsg);
// logger.debug("[{}] Rpc command response sent to remote plugin actor [{}]!", deviceId, requestMd.getMsg().getMsg().getId());
// } else {
// context.parent().tell(responsePluginMsg, ActorRef.noSender());
// logger.debug("[{}] Rpc command response sent to local plugin actor [{}]!", deviceId, requestMd.getMsg().getMsg().getId());
// }
}
@Override
public void process(FromDeviceRpcResponse response) {
//TODO: send to another server if needed.
UUID requestId = response.getId();
LocalRequestMetaData md = localRpcRequests.remove(requestId);
if (md != null) {

3
application/src/main/java/org/thingsboard/server/service/rpc/DeviceRpcService.java

@ -17,6 +17,7 @@ package org.thingsboard.server.service.rpc;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse;
import org.thingsboard.server.extensions.api.plugins.msg.RpcError;
@ -31,6 +32,8 @@ public interface DeviceRpcService {
void process(ToDeviceRpcRequest request, LocalRequestMetaData metaData);
void process(ToDeviceRpcRequest request, ServerAddress originator);
void process(FromDeviceRpcResponse response);
void logRpcCall(SecurityUser user, EntityId entityId, ToDeviceRpcRequestBody body, boolean oneWay, Optional<RpcError> rpcError, Throwable e);

6
application/src/main/java/org/thingsboard/server/service/rpc/ToDeviceRpcRequestMsg.java

@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
import lombok.ToString;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
@ -54,4 +55,9 @@ public class ToDeviceRpcRequestMsg implements ToDeviceActorNotificationMsg {
public TenantId getTenantId() {
return msg.getTenantId();
}
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG;
}
}

16
application/src/main/resources/thingsboard.yml

@ -207,18 +207,7 @@ actors:
sync:
# Default timeout for processing request using synchronous session (HTTP, CoAP) in milliseconds
timeout: "${ACTORS_SESSION_SYNC_TIMEOUT:10000}"
plugin:
# Default timeout for termination of the plugin actor after it is stopped
termination.delay: "${ACTORS_PLUGIN_TERMINATION_DELAY:60000}"
# Default timeout for processing of particular message by particular plugin
processing.timeout: "${ACTORS_PLUGIN_TIMEOUT:60000}"
# Errors for particular actor are persisted once per specified amount of milliseconds
error_persist_frequency: "${ACTORS_PLUGIN_ERROR_FREQUENCY:3000}"
rule:
# Default timeout for termination of the rule actor after it is stopped
termination.delay: "${ACTORS_RULE_TERMINATION_DELAY:30000}"
# Errors for particular actor are persisted once per specified amount of milliseconds
error_persist_frequency: "${ACTORS_RULE_ERROR_FREQUENCY:3000}"
# Specify thread pool size for database request callbacks executor service
db_callback_thread_pool_size: "${ACTORS_RULE_DB_CALLBACK_THREAD_POOL_SIZE:1}"
# Specify thread pool size for javascript executor service
@ -235,6 +224,11 @@ actors:
# Enable/disable actor statistics
enabled: "${ACTORS_STATISTICS_ENABLED:true}"
persist_frequency: "${ACTORS_STATISTICS_PERSIST_FREQUENCY:3600000}"
queue:
# Enable/disable persistence of un-processed messages to the queue
enabled: "${ACTORS_QUEUE_ENABLED:true}"
# Maximum allowed timeout for persistence into the queue
timeout: "${ACTORS_QUEUE_PERSISTENCE_TIMEOUT:30000}"
cache:
# caffeine or redis

44
common/message/src/main/java/org/thingsboard/server/common/msg/MsgType.java

@ -18,27 +18,30 @@ package org.thingsboard.server.common.msg;
/**
* Created by ashvayka on 15.03.18.
*/
//TODO: add all "See" references
public enum MsgType {
/**
* ADDED/UPDATED/DELETED events for server nodes.
*
* See {@link org.thingsboard.server.common.msg.cluster.ClusterEventMsg}
*/
CLUSTER_EVENT_MSG,
/**
* ADDED/UPDATED/DELETED events for main entities.
*
* @See {@link org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg}
* See {@link org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg}
*/
COMPONENT_LIFE_CYCLE_MSG,
/**
* Misc messages from the REST API/SERVICE layer to the new rule engine.
*
* @See {@link org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg}
* See {@link org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg}
*/
SERVICE_TO_RULE_ENGINE_MSG,
SESSION_TO_DEVICE_ACTOR_MSG,
DEVICE_ACTOR_TO_SESSION_MSG,
/**
* Message that is sent by RuleChainActor to RuleActor with command to process TbMsg.
*/
@ -59,4 +62,31 @@ public enum MsgType {
*/
RULE_TO_SELF_MSG,
/**
* Message that is sent by Session Actor to Device Actor. Represents messages from the device itself.
*/
DEVICE_SESSION_TO_DEVICE_ACTOR_MSG,
DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG,
DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG,
DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG,
DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG,
DEVICE_ACTOR_RPC_TIMEOUT_MSG,
DEVICE_ACTOR_QUEUE_TIMEOUT_MSG,
/**
* Message that is sent from the Device Actor to Rule Engine. Requires acknowledgement
*/
DEVICE_ACTOR_TO_RULE_ENGINE_MSG,
/**
* Message that is sent from Rule Engine to the Device Actor when message is successfully pushed to queue.
*/
RULE_ENGINE_QUEUE_PUT_ACK_MSG;
}

4
common/message/src/main/java/org/thingsboard/server/common/msg/TbMsgMetaData.java

@ -31,10 +31,10 @@ import java.util.concurrent.ConcurrentHashMap;
@NoArgsConstructor
public final class TbMsgMetaData implements Serializable {
private Map<String, String> data = new ConcurrentHashMap<>();
private final Map<String, String> data = new ConcurrentHashMap<>();
public TbMsgMetaData(Map<String, String> data) {
this.data = data;
this.data.putAll(data);
}
public String getValue(String key) {

8
common/message/src/main/java/org/thingsboard/server/common/msg/cluster/ClusterEventMsg.java

@ -16,14 +16,20 @@
package org.thingsboard.server.common.msg.cluster;
import lombok.Data;
import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.TbActorMsg;
/**
* @author Andrew Shvayka
*/
@Data
public final class ClusterEventMsg {
public final class ClusterEventMsg implements TbActorMsg {
private final ServerAddress serverAddress;
private final boolean added;
@Override
public MsgType getMsgType() {
return MsgType.CLUSTER_EVENT_MSG;
}
}

6
common/message/src/main/java/org/thingsboard/server/common/msg/core/AttributesSubscribeMsg.java

@ -16,14 +16,14 @@
package org.thingsboard.server.common.msg.core;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
*/
public class AttributesSubscribeMsg implements FromDeviceMsg {
@Override
public MsgType getMsgType() {
return MsgType.SUBSCRIBE_ATTRIBUTES_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.SUBSCRIBE_ATTRIBUTES_REQUEST;
}
}

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/AttributesUnsubscribeMsg.java

@ -16,14 +16,15 @@
package org.thingsboard.server.common.msg.core;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
*/
public class AttributesUnsubscribeMsg implements FromDeviceMsg {
@Override
public MsgType getMsgType() {
return MsgType.UNSUBSCRIBE_ATTRIBUTES_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.UNSUBSCRIBE_ATTRIBUTES_REQUEST;
}
}

8
common/message/src/main/java/org/thingsboard/server/common/msg/core/AttributesUpdateNotification.java

@ -17,7 +17,8 @@ package org.thingsboard.server.common.msg.core;
import lombok.ToString;
import org.thingsboard.server.common.msg.kv.AttributesKVMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
@ToString
@ -36,9 +37,8 @@ public class AttributesUpdateNotification implements ToDeviceMsg {
return true;
}
@Override
public MsgType getMsgType() {
return MsgType.ATTRIBUTES_UPDATE_NOTIFICATION;
public SessionMsgType getSessionMsgType() {
return SessionMsgType.ATTRIBUTES_UPDATE_NOTIFICATION;
}
public AttributesKVMsg getData() {

13
common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicCommandAckResponse.java

@ -15,26 +15,27 @@
*/
package org.thingsboard.server.common.msg.core;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
public class BasicCommandAckResponse extends BasicResponseMsg<Integer> implements StatusCodeResponse {
private static final long serialVersionUID = 1L;
public static BasicCommandAckResponse onSuccess(MsgType requestMsgType, Integer requestId) {
public static BasicCommandAckResponse onSuccess(SessionMsgType requestMsgType, Integer requestId) {
return BasicCommandAckResponse.onSuccess(requestMsgType, requestId, 200);
}
public static BasicCommandAckResponse onSuccess(MsgType requestMsgType, Integer requestId, Integer code) {
public static BasicCommandAckResponse onSuccess(SessionMsgType requestMsgType, Integer requestId, Integer code) {
return new BasicCommandAckResponse(requestMsgType, requestId, true, null, code);
}
public static BasicCommandAckResponse onError(MsgType requestMsgType, Integer requestId, Exception error) {
public static BasicCommandAckResponse onError(SessionMsgType requestMsgType, Integer requestId, Exception error) {
return new BasicCommandAckResponse(requestMsgType, requestId, false, error, null);
}
private BasicCommandAckResponse(MsgType requestMsgType, Integer requestId, boolean success, Exception error, Integer code) {
super(requestMsgType, requestId, MsgType.TO_DEVICE_RPC_RESPONSE_ACK, success, error, code);
private BasicCommandAckResponse(SessionMsgType requestMsgType, Integer requestId, boolean success, Exception error, Integer code) {
super(requestMsgType, requestId, SessionMsgType.TO_DEVICE_RPC_RESPONSE_ACK, success, error, code);
}
@Override

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicGetAttributesRequest.java

@ -16,7 +16,8 @@
package org.thingsboard.server.common.msg.core;
import lombok.ToString;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.util.Collections;
import java.util.Optional;
@ -41,8 +42,8 @@ public class BasicGetAttributesRequest extends BasicRequest implements GetAttrib
}
@Override
public MsgType getMsgType() {
return MsgType.GET_ATTRIBUTES_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.GET_ATTRIBUTES_REQUEST;
}
@Override

11
common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicGetAttributesResponse.java

@ -17,23 +17,24 @@ package org.thingsboard.server.common.msg.core;
import lombok.ToString;
import org.thingsboard.server.common.msg.kv.AttributesKVMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
@ToString
public class BasicGetAttributesResponse extends BasicResponseMsg<AttributesKVMsg> implements GetAttributesResponse {
private static final long serialVersionUID = 1L;
public static BasicGetAttributesResponse onSuccess(MsgType requestMsgType, int requestId, AttributesKVMsg code) {
public static BasicGetAttributesResponse onSuccess(SessionMsgType requestMsgType, int requestId, AttributesKVMsg code) {
return new BasicGetAttributesResponse(requestMsgType, requestId, true, null, code);
}
public static BasicGetAttributesResponse onError(MsgType requestMsgType, int requestId, Exception error) {
public static BasicGetAttributesResponse onError(SessionMsgType requestMsgType, int requestId, Exception error) {
return new BasicGetAttributesResponse(requestMsgType, requestId, false, error, null);
}
private BasicGetAttributesResponse(MsgType requestMsgType, int requestId, boolean success, Exception error, AttributesKVMsg code) {
super(requestMsgType, requestId, MsgType.GET_ATTRIBUTES_RESPONSE, success, error, code);
private BasicGetAttributesResponse(SessionMsgType requestMsgType, int requestId, boolean success, Exception error, AttributesKVMsg code) {
super(requestMsgType, requestId, SessionMsgType.GET_ATTRIBUTES_RESPONSE, success, error, code);
}
}

18
common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicResponseMsg.java

@ -18,32 +18,33 @@ package org.thingsboard.server.common.msg.core;
import java.io.Serializable;
import java.util.Optional;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
public class BasicResponseMsg<T extends Serializable> implements ResponseMsg<T> {
private static final long serialVersionUID = 1L;
private final MsgType requestMsgType;
private final SessionMsgType requestMsgType;
private final Integer requestId;
private final MsgType msgType;
private final SessionMsgType sessionMsgType;
private final boolean success;
private final T data;
private final Exception error;
protected BasicResponseMsg(MsgType requestMsgType, Integer requestId, MsgType msgType, boolean success, Exception error, T data) {
protected BasicResponseMsg(SessionMsgType requestMsgType, Integer requestId, SessionMsgType sessionMsgType, boolean success, Exception error, T data) {
super();
this.requestMsgType = requestMsgType;
this.requestId = requestId;
this.msgType = msgType;
this.sessionMsgType = sessionMsgType;
this.success = success;
this.error = error;
this.data = data;
}
@Override
public MsgType getRequestMsgType() {
public SessionMsgType getRequestMsgType() {
return requestMsgType;
}
@ -72,8 +73,7 @@ public class BasicResponseMsg<T extends Serializable> implements ResponseMsg<T>
return "BasicResponseMsg [success=" + success + ", data=" + data + ", error=" + error + "]";
}
@Override
public MsgType getMsgType() {
return msgType;
public SessionMsgType getSessionMsgType() {
return sessionMsgType;
}
}

13
common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicStatusCodeResponse.java

@ -16,26 +16,27 @@
package org.thingsboard.server.common.msg.core;
import lombok.ToString;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
@ToString
public class BasicStatusCodeResponse extends BasicResponseMsg<Integer> implements StatusCodeResponse {
private static final long serialVersionUID = 1L;
public static BasicStatusCodeResponse onSuccess(MsgType requestMsgType, Integer requestId) {
public static BasicStatusCodeResponse onSuccess(SessionMsgType requestMsgType, Integer requestId) {
return BasicStatusCodeResponse.onSuccess(requestMsgType, requestId, 0);
}
public static BasicStatusCodeResponse onSuccess(MsgType requestMsgType, Integer requestId, Integer code) {
public static BasicStatusCodeResponse onSuccess(SessionMsgType requestMsgType, Integer requestId, Integer code) {
return new BasicStatusCodeResponse(requestMsgType, requestId, true, null, code);
}
public static BasicStatusCodeResponse onError(MsgType requestMsgType, Integer requestId, Exception error) {
public static BasicStatusCodeResponse onError(SessionMsgType requestMsgType, Integer requestId, Exception error) {
return new BasicStatusCodeResponse(requestMsgType, requestId, false, error, null);
}
private BasicStatusCodeResponse(MsgType requestMsgType, Integer requestId, boolean success, Exception error, Integer code) {
super(requestMsgType, requestId, MsgType.STATUS_CODE_RESPONSE, success, error, code);
private BasicStatusCodeResponse(SessionMsgType requestMsgType, Integer requestId, boolean success, Exception error, Integer code) {
super(requestMsgType, requestId, SessionMsgType.STATUS_CODE_RESPONSE, success, error, code);
}
}

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicTelemetryUploadRequest.java

@ -21,7 +21,8 @@ import java.util.List;
import java.util.Map;
import org.thingsboard.server.common.data.kv.KvEntry;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
public class BasicTelemetryUploadRequest extends BasicRequest implements TelemetryUploadRequest {
@ -48,8 +49,8 @@ public class BasicTelemetryUploadRequest extends BasicRequest implements Telemet
}
@Override
public MsgType getMsgType() {
return MsgType.POST_TELEMETRY_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.POST_TELEMETRY_REQUEST;
}
@Override

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/BasicUpdateAttributesRequest.java

@ -20,7 +20,8 @@ import java.util.LinkedHashSet;
import java.util.Set;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
public class BasicUpdateAttributesRequest extends BasicRequest implements UpdateAttributesRequest {
@ -46,8 +47,8 @@ public class BasicUpdateAttributesRequest extends BasicRequest implements Update
}
@Override
public MsgType getMsgType() {
return MsgType.POST_ATTRIBUTES_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.POST_ATTRIBUTES_REQUEST;
}
@Override

4
common/message/src/main/java/org/thingsboard/server/common/msg/core/ResponseMsg.java

@ -18,12 +18,12 @@ package org.thingsboard.server.common.msg.core;
import java.io.Serializable;
import java.util.Optional;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
public interface ResponseMsg<T extends Serializable> extends ToDeviceMsg {
MsgType getRequestMsgType();
SessionMsgType getRequestMsgType();
Integer getRequestId();

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/RpcSubscribeMsg.java

@ -16,14 +16,15 @@
package org.thingsboard.server.common.msg.core;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
*/
public class RpcSubscribeMsg implements FromDeviceMsg {
@Override
public MsgType getMsgType() {
return MsgType.SUBSCRIBE_RPC_COMMANDS_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.SUBSCRIBE_RPC_COMMANDS_REQUEST;
}
}

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/RpcUnsubscribeMsg.java

@ -16,14 +16,15 @@
package org.thingsboard.server.common.msg.core;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
*/
public class RpcUnsubscribeMsg implements FromDeviceMsg {
@Override
public MsgType getMsgType() {
return MsgType.UNSUBSCRIBE_RPC_COMMANDS_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.UNSUBSCRIBE_RPC_COMMANDS_REQUEST;
}
}

2
common/message/src/main/java/org/thingsboard/server/common/msg/core/RuleEngineError.java

@ -21,7 +21,7 @@ package org.thingsboard.server.common.msg.core;
public enum RuleEngineError {
NO_RULES, NO_ACTIVE_RULES, NO_FILTERS_MATCHED, NO_REQUEST_FROM_ACTIONS, NO_TWO_WAY_ACTIONS, NO_RESPONSE_FROM_ACTIONS, PLUGIN_TIMEOUT(true);
NO_RULES, NO_ACTIVE_RULES, NO_FILTERS_MATCHED, NO_REQUEST_FROM_ACTIONS, NO_TWO_WAY_ACTIONS, NO_RESPONSE_FROM_ACTIONS, QUEUE_PUT_TIMEOUT(true);
private final boolean critical;

12
common/message/src/main/java/org/thingsboard/server/common/msg/core/RuleEngineErrorMsg.java

@ -16,7 +16,8 @@
package org.thingsboard.server.common.msg.core;
import lombok.Data;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
/**
@ -25,7 +26,7 @@ import org.thingsboard.server.common.msg.session.ToDeviceMsg;
@Data
public class RuleEngineErrorMsg implements ToDeviceMsg {
private final MsgType inMsgType;
private final SessionMsgType inSessionMsgType;
private final RuleEngineError error;
@Override
@ -33,9 +34,8 @@ public class RuleEngineErrorMsg implements ToDeviceMsg {
return false;
}
@Override
public MsgType getMsgType() {
return MsgType.RULE_ENGINE_ERROR;
public SessionMsgType getSessionMsgType() {
return SessionMsgType.RULE_ENGINE_ERROR;
}
public String getErrorMsg() {
@ -52,7 +52,7 @@ public class RuleEngineErrorMsg implements ToDeviceMsg {
return "Rule filters match, but no rule with two-way action configured!";
case NO_RESPONSE_FROM_ACTIONS:
return "Rule filters match, message processed by plugin, but no response produced by rule action!";
case PLUGIN_TIMEOUT:
case QUEUE_PUT_TIMEOUT:
return "Timeout during processing of message by plugin!";
default:
throw new RuntimeException("Error " + error + " is not supported!");

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/SessionCloseMsg.java

@ -16,14 +16,15 @@
package org.thingsboard.server.common.msg.core;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
*/
public class SessionCloseMsg implements FromDeviceMsg {
@Override
public MsgType getMsgType() {
return MsgType.SESSION_CLOSE;
public SessionMsgType getMsgType() {
return SessionMsgType.SESSION_CLOSE;
}
}

8
common/message/src/main/java/org/thingsboard/server/common/msg/core/SessionCloseNotification.java

@ -17,7 +17,8 @@ package org.thingsboard.server.common.msg.core;
import lombok.ToString;
import org.thingsboard.server.common.msg.kv.AttributesKVMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
@ToString
@ -30,9 +31,8 @@ public class SessionCloseNotification implements ToDeviceMsg {
return true;
}
@Override
public MsgType getMsgType() {
return MsgType.SESSION_CLOSE;
public SessionMsgType getSessionMsgType() {
return SessionMsgType.SESSION_CLOSE;
}
}

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/SessionOpenMsg.java

@ -16,14 +16,15 @@
package org.thingsboard.server.common.msg.core;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
*/
public class SessionOpenMsg implements FromDeviceMsg {
@Override
public MsgType getMsgType() {
return MsgType.SESSION_OPEN;
public SessionMsgType getMsgType() {
return SessionMsgType.SESSION_OPEN;
}
}

8
common/message/src/main/java/org/thingsboard/server/common/msg/core/ToDeviceRpcRequestMsg.java

@ -16,7 +16,8 @@
package org.thingsboard.server.common.msg.core;
import lombok.Data;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
/**
@ -29,9 +30,8 @@ public class ToDeviceRpcRequestMsg implements ToDeviceMsg {
private final String method;
private final String params;
@Override
public MsgType getMsgType() {
return MsgType.TO_DEVICE_RPC_REQUEST;
public SessionMsgType getSessionMsgType() {
return SessionMsgType.TO_DEVICE_RPC_REQUEST;
}
@Override

7
common/message/src/main/java/org/thingsboard/server/common/msg/core/ToDeviceRpcResponseMsg.java

@ -17,7 +17,8 @@ package org.thingsboard.server.common.msg.core;
import lombok.Data;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
@ -29,7 +30,7 @@ public class ToDeviceRpcResponseMsg implements FromDeviceMsg {
private final String data;
@Override
public MsgType getMsgType() {
return MsgType.TO_DEVICE_RPC_RESPONSE;
public SessionMsgType getMsgType() {
return SessionMsgType.TO_DEVICE_RPC_RESPONSE;
}
}

6
common/message/src/main/java/org/thingsboard/server/common/msg/core/ToServerRpcRequestMsg.java

@ -17,7 +17,7 @@ package org.thingsboard.server.common.msg.core;
import lombok.Data;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
/**
* @author Andrew Shvayka
@ -30,7 +30,7 @@ public class ToServerRpcRequestMsg implements FromDeviceRequestMsg {
private final String params;
@Override
public MsgType getMsgType() {
return MsgType.TO_SERVER_RPC_REQUEST;
public SessionMsgType getMsgType() {
return SessionMsgType.TO_SERVER_RPC_REQUEST;
}
}

8
common/message/src/main/java/org/thingsboard/server/common/msg/core/ToServerRpcResponseMsg.java

@ -17,7 +17,8 @@ package org.thingsboard.server.common.msg.core;
import lombok.Data;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
/**
@ -29,9 +30,8 @@ public class ToServerRpcResponseMsg implements ToDeviceMsg {
private final int requestId;
private final String data;
@Override
public MsgType getMsgType() {
return MsgType.TO_SERVER_RPC_RESPONSE;
public SessionMsgType getSessionMsgType() {
return SessionMsgType.TO_SERVER_RPC_RESPONSE;
}
@Override

20
common/message/src/main/java/org/thingsboard/server/common/msg/device/BasicToDeviceActorMsg.java → common/message/src/main/java/org/thingsboard/server/common/msg/device/BasicDeviceToDeviceActorMsg.java

@ -20,6 +20,7 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.SessionId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.SessionType;
@ -28,7 +29,7 @@ import org.thingsboard.server.common.msg.session.ToDeviceActorSessionMsg;
import java.util.Optional;
@ToString
public class BasicToDeviceActorMsg implements ToDeviceActorMsg {
public class BasicDeviceToDeviceActorMsg implements DeviceToDeviceActorMsg {
private static final long serialVersionUID = -1866795134993115408L;
@ -40,16 +41,16 @@ public class BasicToDeviceActorMsg implements ToDeviceActorMsg {
private final ServerAddress serverAddress;
private final FromDeviceMsg msg;
public BasicToDeviceActorMsg(ToDeviceActorMsg other, FromDeviceMsg msg) {
public BasicDeviceToDeviceActorMsg(DeviceToDeviceActorMsg other, FromDeviceMsg msg) {
this(null, other.getTenantId(), other.getCustomerId(), other.getDeviceId(), other.getSessionId(), other.getSessionType(), msg);
}
public BasicToDeviceActorMsg(ToDeviceActorSessionMsg msg, SessionType sessionType) {
public BasicDeviceToDeviceActorMsg(ToDeviceActorSessionMsg msg, SessionType sessionType) {
this(null, msg.getTenantId(), msg.getCustomerId(), msg.getDeviceId(), msg.getSessionId(), sessionType, msg.getSessionMsg().getMsg());
}
private BasicToDeviceActorMsg(ServerAddress serverAddress, TenantId tenantId, CustomerId customerId, DeviceId deviceId, SessionId sessionId, SessionType sessionType,
FromDeviceMsg msg) {
private BasicDeviceToDeviceActorMsg(ServerAddress serverAddress, TenantId tenantId, CustomerId customerId, DeviceId deviceId, SessionId sessionId, SessionType sessionType,
FromDeviceMsg msg) {
super();
this.serverAddress = serverAddress;
this.tenantId = tenantId;
@ -95,7 +96,12 @@ public class BasicToDeviceActorMsg implements ToDeviceActorMsg {
}
@Override
public ToDeviceActorMsg toOtherAddress(ServerAddress otherAddress) {
return new BasicToDeviceActorMsg(otherAddress, tenantId, customerId, deviceId, sessionId, sessionType, msg);
public DeviceToDeviceActorMsg toOtherAddress(ServerAddress otherAddress) {
return new BasicDeviceToDeviceActorMsg(otherAddress, tenantId, customerId, deviceId, sessionId, sessionType, msg);
}
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_SESSION_TO_DEVICE_ACTOR_MSG;
}
}

5
common/message/src/main/java/org/thingsboard/server/common/msg/device/ToDeviceActorMsg.java → common/message/src/main/java/org/thingsboard/server/common/msg/device/DeviceToDeviceActorMsg.java

@ -19,6 +19,7 @@ import java.io.Serializable;
import java.util.Optional;
import org.thingsboard.server.common.data.id.SessionId;
import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.aware.CustomerAwareMsg;
import org.thingsboard.server.common.msg.aware.DeviceAwareMsg;
import org.thingsboard.server.common.msg.aware.TenantAwareMsg;
@ -26,7 +27,7 @@ import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.SessionType;
public interface ToDeviceActorMsg extends DeviceAwareMsg, CustomerAwareMsg, TenantAwareMsg, Serializable {
public interface DeviceToDeviceActorMsg extends TbActorMsg, DeviceAwareMsg, CustomerAwareMsg, TenantAwareMsg, Serializable {
SessionId getSessionId();
@ -36,5 +37,5 @@ public interface ToDeviceActorMsg extends DeviceAwareMsg, CustomerAwareMsg, Tena
FromDeviceMsg getPayload();
ToDeviceActorMsg toOtherAddress(ServerAddress otherAddress);
DeviceToDeviceActorMsg toOtherAddress(ServerAddress otherAddress);
}

2
common/message/src/main/java/org/thingsboard/server/common/msg/session/FromDeviceMsg.java

@ -19,6 +19,6 @@ import java.io.Serializable;
public interface FromDeviceMsg extends Serializable {
MsgType getMsgType();
SessionMsgType getMsgType();
}

6
common/message/src/main/java/org/thingsboard/server/common/msg/session/MsgType.java → common/message/src/main/java/org/thingsboard/server/common/msg/session/SessionMsgType.java

@ -15,7 +15,7 @@
*/
package org.thingsboard.server.common.msg.session;
public enum MsgType {
public enum SessionMsgType {
GET_ATTRIBUTES_REQUEST(true), POST_ATTRIBUTES_REQUEST(true), GET_ATTRIBUTES_RESPONSE,
SUBSCRIBE_ATTRIBUTES_REQUEST, UNSUBSCRIBE_ATTRIBUTES_REQUEST, ATTRIBUTES_UPDATE_NOTIFICATION,
@ -32,11 +32,11 @@ public enum MsgType {
private final boolean requiresRulesProcessing;
MsgType() {
SessionMsgType() {
this(false);
}
MsgType(boolean requiresRulesProcessing) {
SessionMsgType(boolean requiresRulesProcessing) {
this.requiresRulesProcessing = requiresRulesProcessing;
}

2
common/message/src/main/java/org/thingsboard/server/common/msg/session/ToDeviceMsg.java

@ -21,6 +21,6 @@ public interface ToDeviceMsg extends Serializable {
boolean isSuccess();
MsgType getMsgType();
SessionMsgType getSessionMsgType();
}

15
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/msg/TimeoutIntMsg.java → common/message/src/main/java/org/thingsboard/server/common/msg/timeout/DeviceActorQueueTimeoutMsg.java

@ -13,15 +13,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.extensions.api.plugins.msg;
package org.thingsboard.server.common.msg.timeout;
import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import java.util.UUID;
/**
* @author Andrew Shvayka
*/
public final class TimeoutIntMsg extends TimeoutMsg<Integer> {
public final class DeviceActorQueueTimeoutMsg extends TimeoutMsg<UUID> {
public TimeoutIntMsg(Integer id, long timeout) {
public DeviceActorQueueTimeoutMsg(UUID id, long timeout) {
super(id, timeout);
}
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_ACTOR_QUEUE_TIMEOUT_MSG;
}
}

12
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/msg/TimeoutUUIDMsg.java → common/message/src/main/java/org/thingsboard/server/common/msg/timeout/DeviceActorRpcTimeoutMsg.java

@ -13,17 +13,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.extensions.api.plugins.msg;
package org.thingsboard.server.common.msg.timeout;
import java.util.UUID;
import org.thingsboard.server.common.msg.MsgType;
/**
* @author Andrew Shvayka
*/
public final class TimeoutUUIDMsg extends TimeoutMsg<UUID> {
public final class DeviceActorRpcTimeoutMsg extends TimeoutMsg<Integer> {
public TimeoutUUIDMsg(UUID id, long timeout) {
public DeviceActorRpcTimeoutMsg(Integer id, long timeout) {
super(id, timeout);
}
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_ACTOR_RPC_TIMEOUT_MSG;
}
}

5
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/msg/TimeoutMsg.java → common/message/src/main/java/org/thingsboard/server/common/msg/timeout/TimeoutMsg.java

@ -13,15 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.extensions.api.plugins.msg;
package org.thingsboard.server.common.msg.timeout;
import lombok.Data;
import org.thingsboard.server.common.msg.TbActorMsg;
/**
* @author Andrew Shvayka
*/
@Data
public class TimeoutMsg<T> {
public abstract class TimeoutMsg<T> implements TbActorMsg {
private final T id;
private final long timeout;
}

4
common/transport/src/main/java/org/thingsboard/server/common/transport/TransportAdaptor.java

@ -16,7 +16,7 @@
package org.thingsboard.server.common.transport;
import org.thingsboard.server.common.msg.session.AdaptorToSessionActorMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionActorToAdaptorMsg;
import org.thingsboard.server.common.msg.session.SessionContext;
import org.thingsboard.server.common.transport.adaptor.AdaptorException;
@ -25,7 +25,7 @@ import java.util.Optional;
public interface TransportAdaptor<C extends SessionContext, T, V> {
AdaptorToSessionActorMsg convertToActorMsg(C ctx, MsgType type, T inbound) throws AdaptorException;
AdaptorToSessionActorMsg convertToActorMsg(C ctx, SessionMsgType type, T inbound) throws AdaptorException;
Optional<V> convertToAdaptorMsg(C ctx, SessionActorToAdaptorMsg msg) throws AdaptorException;

2
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java

@ -75,6 +75,8 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
log.trace("Save system rule chain with predefined id {}", SYSTEM_TENANT);
ruleChain.setTenantId(SYSTEM_TENANT);
}
//TODO: Temporary Hack to continue tests;
ruleChain.setRoot(true);
RuleChain savedRuleChain = ruleChainDao.save(ruleChain);
if (ruleChain.isRoot() && ruleChain.getTenantId() != null && ruleChain.getId() == null) {
try {

5
extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceAttributesEventNotificationMsg.java

@ -22,6 +22,7 @@ import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.AttributeKey;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.common.msg.MsgType;
import java.util.List;
import java.util.Set;
@ -54,4 +55,8 @@ public class DeviceAttributesEventNotificationMsg implements ToDeviceActorNotifi
return new DeviceAttributesEventNotificationMsg(tenantId, deviceId, keys, null, null, true);
}
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG;
}
}

5
extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceCredentialsUpdateNotificationMsg.java

@ -21,6 +21,7 @@ import lombok.ToString;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.AttributeKey;
import org.thingsboard.server.common.msg.MsgType;
import java.util.Set;
@ -33,4 +34,8 @@ public class DeviceCredentialsUpdateNotificationMsg implements ToDeviceActorNoti
private final TenantId tenantId;
private final DeviceId deviceId;
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG;
}
}

6
extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java

@ -19,6 +19,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.MsgType;
@Data
@AllArgsConstructor
@ -27,4 +28,9 @@ public class DeviceNameOrTypeUpdateMsg implements ToDeviceActorNotificationMsg {
private final DeviceId deviceId;
private final String deviceName;
private final String deviceType;
@Override
public MsgType getMsgType() {
return MsgType.DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG;
}
}

3
extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/ToDeviceActorNotificationMsg.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.extensions.api.device;
import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.aware.DeviceAwareMsg;
import org.thingsboard.server.common.msg.aware.TenantAwareMsg;
@ -23,6 +24,6 @@ import java.io.Serializable;
/**
* @author Andrew Shvayka
*/
public interface ToDeviceActorNotificationMsg extends TenantAwareMsg, DeviceAwareMsg, Serializable {
public interface ToDeviceActorNotificationMsg extends TbActorMsg, TenantAwareMsg, DeviceAwareMsg, Serializable {
}

2
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/AbstractPlugin.java

@ -21,7 +21,7 @@ import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.extensions.api.plugins.handlers.*;
import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
import org.thingsboard.server.extensions.api.plugins.msg.TimeoutMsg;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.extensions.api.plugins.rest.PluginRestMsg;
import org.thingsboard.server.extensions.api.plugins.rpc.RpcMsg;
import org.thingsboard.server.extensions.api.plugins.ws.msg.PluginWebsocketMsg;

2
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/Plugin.java

@ -21,7 +21,7 @@ import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.extensions.api.component.ConfigurableComponent;
import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
import org.thingsboard.server.extensions.api.plugins.msg.TimeoutMsg;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.extensions.api.plugins.rest.PluginRestMsg;
import org.thingsboard.server.extensions.api.plugins.rpc.RpcMsg;
import org.thingsboard.server.extensions.api.plugins.ws.msg.PluginWebsocketMsg;

4
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/PluginAction.java

@ -15,7 +15,7 @@
*/
package org.thingsboard.server.extensions.api.plugins;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
import org.thingsboard.server.extensions.api.component.ConfigurableComponent;
import org.thingsboard.server.extensions.api.plugins.msg.PluginToRuleMsg;
@ -28,7 +28,7 @@ import java.util.Optional;
public interface PluginAction<T> extends ConfigurableComponent<T>, RuleLifecycleComponent {
Optional<RuleToPluginMsg> convert(RuleContext ctx, ToDeviceActorMsg toDeviceActorMsg, RuleProcessingMetaData deviceMsgMd);
Optional<RuleToPluginMsg> convert(RuleContext ctx, DeviceToDeviceActorMsg deviceToDeviceActorMsg, RuleProcessingMetaData deviceMsgMd);
Optional<ToDeviceMsg> convert(PluginToRuleMsg<?> response);

1
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/PluginContext.java

@ -25,6 +25,7 @@ import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.common.msg.timeout.TimeoutMsg;
import org.thingsboard.server.extensions.api.plugins.msg.*;
import org.thingsboard.server.extensions.api.plugins.rpc.RpcMsg;
import org.thingsboard.server.extensions.api.plugins.ws.PluginWebsocketSessionRef;

7
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/handlers/DefaultRuleMsgHandler.java

@ -18,7 +18,8 @@ package org.thingsboard.server.extensions.api.plugins.handlers;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.id.RuleId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.extensions.api.plugins.PluginContext;
import org.thingsboard.server.extensions.api.plugins.msg.GetAttributesRequestRuleToPluginMsg;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
@ -56,8 +57,8 @@ public class DefaultRuleMsgHandler implements RuleMsgHandler {
msgTypeNotSupported(msg.getPayload().getMsgType());
}
private void msgTypeNotSupported(MsgType msgType) {
throw new RuntimeException("Not supported msg type: " + msgType + "!");
private void msgTypeNotSupported(SessionMsgType sessionMsgType) {
throw new RuntimeException("Not supported msg type: " + sessionMsgType + "!");
}
}

63
extensions-api/src/main/java/org/thingsboard/server/extensions/api/plugins/msg/ToDeviceRpcRequestPluginMsg.java

@ -1,63 +0,0 @@
/**
* Copyright © 2016-2018 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.extensions.api.plugins.msg;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg;
import java.util.Optional;
/**
* @author Andrew Shvayka
*/
@ToString
@RequiredArgsConstructor
public class ToDeviceRpcRequestPluginMsg implements ToDeviceActorNotificationMsg {
private final ServerAddress serverAddress;
@Getter
private final PluginId pluginId;
@Getter
private final TenantId pluginTenantId;
@Getter
private final ToDeviceRpcRequest msg;
public ToDeviceRpcRequestPluginMsg(PluginId pluginId, TenantId pluginTenantId, ToDeviceRpcRequest msg) {
this(null, pluginId, pluginTenantId, msg);
}
public Optional<ServerAddress> getServerAddress() {
return Optional.ofNullable(serverAddress);
}
@Override
public DeviceId getDeviceId() {
return msg.getDeviceId();
}
@Override
public TenantId getTenantId() {
return msg.getTenantId();
}
}

4
extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleFilter.java

@ -15,7 +15,7 @@
*/
package org.thingsboard.server.extensions.api.rules;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.component.ConfigurableComponent;
/**
@ -23,6 +23,6 @@ import org.thingsboard.server.extensions.api.component.ConfigurableComponent;
*/
public interface RuleFilter<T> extends ConfigurableComponent<T>, RuleLifecycleComponent {
boolean filter(RuleContext ctx, ToDeviceActorMsg msg);
boolean filter(RuleContext ctx, DeviceToDeviceActorMsg msg);
}

6
extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleProcessor.java

@ -15,15 +15,13 @@
*/
package org.thingsboard.server.extensions.api.rules;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.component.ConfigurableComponent;
import javax.script.ScriptException;
/**
* @author Andrew Shvayka
*/
public interface RuleProcessor<T> extends ConfigurableComponent<T>, RuleLifecycleComponent {
RuleProcessingMetaData process(RuleContext ctx, ToDeviceActorMsg msg) throws RuleException;
RuleProcessingMetaData process(RuleContext ctx, DeviceToDeviceActorMsg msg) throws RuleException;
}

6
extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/mail/SendMailAction.java

@ -20,7 +20,7 @@ import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.runtime.parser.ParseException;
import org.springframework.util.StringUtils;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.PluginAction;
@ -74,7 +74,7 @@ public class SendMailAction extends SimpleRuleLifecycleComponent implements Plug
}
@Override
public Optional<RuleToPluginMsg> convert(RuleContext ctx, ToDeviceActorMsg toDeviceActorMsg, RuleProcessingMetaData metadata) {
public Optional<RuleToPluginMsg> convert(RuleContext ctx, DeviceToDeviceActorMsg deviceToDeviceActorMsg, RuleProcessingMetaData metadata) {
String sendFlag = configuration.getSendFlag();
if (StringUtils.isEmpty(sendFlag) || (Boolean) metadata.get(sendFlag).orElse(Boolean.FALSE)) {
VelocityContext context = VelocityUtils.createContext(metadata);
@ -86,7 +86,7 @@ public class SendMailAction extends SimpleRuleLifecycleComponent implements Plug
bccTemplate.ifPresent(t -> builder.bcc(VelocityUtils.merge(t, context)));
subjectTemplate.ifPresent(t -> builder.subject(VelocityUtils.merge(t, context)));
bodyTemplate.ifPresent(t -> builder.body(VelocityUtils.merge(t, context)));
return Optional.of(new SendMailRuleToPluginActionMsg(toDeviceActorMsg.getTenantId(), toDeviceActorMsg.getCustomerId(), toDeviceActorMsg.getDeviceId(),
return Optional.of(new SendMailRuleToPluginActionMsg(deviceToDeviceActorMsg.getTenantId(), deviceToDeviceActorMsg.getCustomerId(), deviceToDeviceActorMsg.getDeviceId(),
builder.build()));
} else {
return Optional.empty();

15
extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/rpc/RpcPluginAction.java

@ -16,9 +16,10 @@
package org.thingsboard.server.extensions.core.action.rpc;
import org.thingsboard.server.common.msg.core.ToServerRpcRequestMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.component.EmptyComponentConfiguration;
@ -41,12 +42,12 @@ public class RpcPluginAction extends SimpleRuleLifecycleComponent implements Plu
}
@Override
public Optional<RuleToPluginMsg> convert(RuleContext ctx, ToDeviceActorMsg toDeviceActorMsg, RuleProcessingMetaData deviceMsgMd) {
FromDeviceMsg msg = toDeviceActorMsg.getPayload();
if (msg.getMsgType() == MsgType.TO_SERVER_RPC_REQUEST) {
public Optional<RuleToPluginMsg> convert(RuleContext ctx, DeviceToDeviceActorMsg deviceToDeviceActorMsg, RuleProcessingMetaData deviceMsgMd) {
FromDeviceMsg msg = deviceToDeviceActorMsg.getPayload();
if (msg.getMsgType() == SessionMsgType.TO_SERVER_RPC_REQUEST) {
ToServerRpcRequestMsg payload = (ToServerRpcRequestMsg) msg;
return Optional.of(new RpcRequestRuleToPluginMsg(toDeviceActorMsg.getTenantId(), toDeviceActorMsg.getCustomerId(),
toDeviceActorMsg.getDeviceId(), payload));
return Optional.of(new RpcRequestRuleToPluginMsg(deviceToDeviceActorMsg.getTenantId(), deviceToDeviceActorMsg.getCustomerId(),
deviceToDeviceActorMsg.getDeviceId(), payload));
} else {
return Optional.empty();
}

6
extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/rpc/ServerSideRpcCallAction.java

@ -20,7 +20,7 @@ import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.runtime.parser.ParseException;
import org.springframework.util.StringUtils;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.PluginAction;
@ -64,7 +64,7 @@ public class ServerSideRpcCallAction extends SimpleRuleLifecycleComponent implem
}
@Override
public Optional<RuleToPluginMsg> convert(RuleContext ctx, ToDeviceActorMsg toDeviceActorMsg, RuleProcessingMetaData metadata) {
public Optional<RuleToPluginMsg> convert(RuleContext ctx, DeviceToDeviceActorMsg deviceToDeviceActorMsg, RuleProcessingMetaData metadata) {
String sendFlag = configuration.getSendFlag();
if (StringUtils.isEmpty(sendFlag) || (Boolean) metadata.get(sendFlag).orElse(Boolean.FALSE)) {
VelocityContext context = VelocityUtils.createContext(metadata);
@ -77,7 +77,7 @@ public class ServerSideRpcCallAction extends SimpleRuleLifecycleComponent implem
rpcCallMethodTemplate.ifPresent(t -> builder.rpcCallMethod(VelocityUtils.merge(t, context)));
rpcCallBodyTemplate.ifPresent(t -> builder.rpcCallBody(VelocityUtils.merge(t, context)));
builder.rpcCallTimeoutInSec(configuration.getRpcCallTimeoutInSec());
return Optional.of(new ServerSideRpcCallRuleToPluginActionMsg(toDeviceActorMsg.getTenantId(), toDeviceActorMsg.getCustomerId(), toDeviceActorMsg.getDeviceId(),
return Optional.of(new ServerSideRpcCallRuleToPluginActionMsg(deviceToDeviceActorMsg.getTenantId(), deviceToDeviceActorMsg.getCustomerId(), deviceToDeviceActorMsg.getDeviceId(),
builder.build()));
} else {
return Optional.empty();

27
extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/telemetry/TelemetryPluginAction.java

@ -19,9 +19,10 @@ import org.springframework.util.StringUtils;
import org.thingsboard.server.common.msg.core.GetAttributesRequest;
import org.thingsboard.server.common.msg.core.TelemetryUploadRequest;
import org.thingsboard.server.common.msg.core.UpdateAttributesRequest;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.PluginAction;
@ -50,20 +51,20 @@ public class TelemetryPluginAction extends SimpleRuleLifecycleComponent implemen
}
@Override
public Optional<RuleToPluginMsg> convert(RuleContext ctx, ToDeviceActorMsg toDeviceActorMsg, RuleProcessingMetaData deviceMsgMd) {
FromDeviceMsg msg = toDeviceActorMsg.getPayload();
if (msg.getMsgType() == MsgType.POST_TELEMETRY_REQUEST) {
public Optional<RuleToPluginMsg> convert(RuleContext ctx, DeviceToDeviceActorMsg deviceToDeviceActorMsg, RuleProcessingMetaData deviceMsgMd) {
FromDeviceMsg msg = deviceToDeviceActorMsg.getPayload();
if (msg.getMsgType() == SessionMsgType.POST_TELEMETRY_REQUEST) {
TelemetryUploadRequest payload = (TelemetryUploadRequest) msg;
return Optional.of(new TelemetryUploadRequestRuleToPluginMsg(toDeviceActorMsg.getTenantId(), toDeviceActorMsg.getCustomerId(),
toDeviceActorMsg.getDeviceId(), payload, ttl));
} else if (msg.getMsgType() == MsgType.POST_ATTRIBUTES_REQUEST) {
return Optional.of(new TelemetryUploadRequestRuleToPluginMsg(deviceToDeviceActorMsg.getTenantId(), deviceToDeviceActorMsg.getCustomerId(),
deviceToDeviceActorMsg.getDeviceId(), payload, ttl));
} else if (msg.getMsgType() == SessionMsgType.POST_ATTRIBUTES_REQUEST) {
UpdateAttributesRequest payload = (UpdateAttributesRequest) msg;
return Optional.of(new UpdateAttributesRequestRuleToPluginMsg(toDeviceActorMsg.getTenantId(), toDeviceActorMsg.getCustomerId(),
toDeviceActorMsg.getDeviceId(), payload));
} else if (msg.getMsgType() == MsgType.GET_ATTRIBUTES_REQUEST) {
return Optional.of(new UpdateAttributesRequestRuleToPluginMsg(deviceToDeviceActorMsg.getTenantId(), deviceToDeviceActorMsg.getCustomerId(),
deviceToDeviceActorMsg.getDeviceId(), payload));
} else if (msg.getMsgType() == SessionMsgType.GET_ATTRIBUTES_REQUEST) {
GetAttributesRequest payload = (GetAttributesRequest) msg;
return Optional.of(new GetAttributesRequestRuleToPluginMsg(toDeviceActorMsg.getTenantId(), toDeviceActorMsg.getCustomerId(),
toDeviceActorMsg.getDeviceId(), payload));
return Optional.of(new GetAttributesRequestRuleToPluginMsg(deviceToDeviceActorMsg.getTenantId(), deviceToDeviceActorMsg.getCustomerId(),
deviceToDeviceActorMsg.getDeviceId(), payload));
} else {
return Optional.empty();
}

8
extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java

@ -19,7 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.runtime.parser.ParseException;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.common.msg.session.ToDeviceMsg;
import org.thingsboard.server.extensions.api.plugins.PluginAction;
@ -52,7 +52,7 @@ public abstract class AbstractTemplatePluginAction<T extends TemplateActionConfi
}
@Override
public Optional<RuleToPluginMsg> convert(RuleContext ctx, ToDeviceActorMsg msg, RuleProcessingMetaData deviceMsgMd) {
public Optional<RuleToPluginMsg> convert(RuleContext ctx, DeviceToDeviceActorMsg msg, RuleProcessingMetaData deviceMsgMd) {
FromDeviceRequestMsg payload;
if (msg.getPayload() instanceof FromDeviceRequestMsg) {
payload = (FromDeviceRequestMsg) msg.getPayload();
@ -70,14 +70,14 @@ public abstract class AbstractTemplatePluginAction<T extends TemplateActionConfi
return Optional.empty();
}
protected String getMsgBody(RuleContext ctx, ToDeviceActorMsg msg) {
protected String getMsgBody(RuleContext ctx, DeviceToDeviceActorMsg msg) {
log.trace("Creating context for: {} and payload {}", ctx.getDeviceMetaData(), msg.getPayload());
VelocityContext context = VelocityUtils.createContext(ctx.getDeviceMetaData(), msg.getPayload());
return VelocityUtils.merge(template, context);
}
abstract protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx,
ToDeviceActorMsg msg,
DeviceToDeviceActorMsg msg,
FromDeviceRequestMsg payload);
@Override

7
extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/BasicJsFilter.java

@ -16,8 +16,7 @@
package org.thingsboard.server.extensions.core.filter;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.kv.KvEntry;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.rules.RuleContext;
import org.thingsboard.server.extensions.api.rules.RuleFilter;
@ -39,7 +38,7 @@ public abstract class BasicJsFilter implements RuleFilter<JsFilterConfiguration>
}
@Override
public boolean filter(RuleContext ctx, ToDeviceActorMsg msg) {
public boolean filter(RuleContext ctx, DeviceToDeviceActorMsg msg) {
try {
return doFilter(ctx, msg);
} catch (ScriptException e) {
@ -48,7 +47,7 @@ public abstract class BasicJsFilter implements RuleFilter<JsFilterConfiguration>
}
}
protected abstract boolean doFilter(RuleContext ctx, ToDeviceActorMsg msg) throws ScriptException;
protected abstract boolean doFilter(RuleContext ctx, DeviceToDeviceActorMsg msg) throws ScriptException;
@Override
public void resume() {

4
extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilter.java

@ -17,7 +17,7 @@ package org.thingsboard.server.extensions.core.filter;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.msg.core.UpdateAttributesRequest;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.extensions.api.component.Filter;
import org.thingsboard.server.extensions.api.device.DeviceAttributes;
@ -34,7 +34,7 @@ import javax.script.ScriptException;
public class DeviceAttributesFilter extends BasicJsFilter {
@Override
protected boolean doFilter(RuleContext ctx, ToDeviceActorMsg msg) throws ScriptException {
protected boolean doFilter(RuleContext ctx, DeviceToDeviceActorMsg msg) throws ScriptException {
return evaluator.execute(toBindings(ctx.getDeviceMetaData().getDeviceAttributes(), msg != null ? msg.getPayload() : null));
}

4
extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTelemetryFilter.java

@ -18,7 +18,7 @@ package org.thingsboard.server.extensions.core.filter;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.kv.KvEntry;
import org.thingsboard.server.common.msg.core.TelemetryUploadRequest;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.extensions.api.component.Filter;
import org.thingsboard.server.extensions.api.rules.RuleContext;
@ -34,7 +34,7 @@ import java.util.List;
public class DeviceTelemetryFilter extends BasicJsFilter {
@Override
protected boolean doFilter(RuleContext ctx, ToDeviceActorMsg msg) throws ScriptException {
protected boolean doFilter(RuleContext ctx, DeviceToDeviceActorMsg msg) throws ScriptException {
FromDeviceMsg deviceMsg = msg.getPayload();
if (deviceMsg instanceof TelemetryUploadRequest) {
TelemetryUploadRequest telemetryMsg = (TelemetryUploadRequest) deviceMsg;

7
extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTypeFilter.java

@ -16,8 +16,7 @@
package org.thingsboard.server.extensions.core.filter;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.msg.core.ToServerRpcRequestMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.component.Filter;
import org.thingsboard.server.extensions.api.rules.RuleContext;
import org.thingsboard.server.extensions.api.rules.RuleFilter;
@ -27,8 +26,6 @@ import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import static org.thingsboard.server.common.msg.session.MsgType.TO_SERVER_RPC_REQUEST;
/**
* @author Andrew Shvayka
*/
@ -46,7 +43,7 @@ public class DeviceTypeFilter extends SimpleRuleLifecycleComponent implements Ru
}
@Override
public boolean filter(RuleContext ctx, ToDeviceActorMsg msg) {
public boolean filter(RuleContext ctx, DeviceToDeviceActorMsg msg) {
return deviceTypes.contains(ctx.getDeviceMetaData().getDeviceType());
}
}

6
extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/MethodNameFilter.java

@ -17,7 +17,7 @@ package org.thingsboard.server.extensions.core.filter;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.msg.core.ToServerRpcRequestMsg;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.component.Filter;
import org.thingsboard.server.extensions.api.rules.RuleContext;
import org.thingsboard.server.extensions.api.rules.RuleFilter;
@ -27,7 +27,7 @@ import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import static org.thingsboard.server.common.msg.session.MsgType.TO_SERVER_RPC_REQUEST;
import static org.thingsboard.server.common.msg.session.SessionMsgType.TO_SERVER_RPC_REQUEST;
/**
* @author Andrew Shvayka
@ -46,7 +46,7 @@ public class MethodNameFilter extends SimpleRuleLifecycleComponent implements Ru
}
@Override
public boolean filter(RuleContext ctx, ToDeviceActorMsg msg) {
public boolean filter(RuleContext ctx, DeviceToDeviceActorMsg msg) {
if (msg.getPayload().getMsgType() == TO_SERVER_RPC_REQUEST) {
return methods.contains(((ToServerRpcRequestMsg) msg.getPayload()).getMethod());
} else {

25
extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/MsgTypeFilter.java

@ -16,8 +16,9 @@
package org.thingsboard.server.extensions.core.filter;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.extensions.api.component.Filter;
import org.thingsboard.server.extensions.api.rules.RuleContext;
import org.thingsboard.server.extensions.api.rules.RuleFilter;
@ -35,30 +36,30 @@ import java.util.stream.Collectors;
@Slf4j
public class MsgTypeFilter extends SimpleRuleLifecycleComponent implements RuleFilter<MsgTypeFilterConfiguration> {
private List<MsgType> msgTypes;
private List<SessionMsgType> sessionMsgTypes;
@Override
public void init(MsgTypeFilterConfiguration configuration) {
msgTypes = Arrays.stream(configuration.getMessageTypes()).map(type -> {
sessionMsgTypes = Arrays.stream(configuration.getMessageTypes()).map(type -> {
switch (type) {
case "GET_ATTRIBUTES":
return MsgType.GET_ATTRIBUTES_REQUEST;
return SessionMsgType.GET_ATTRIBUTES_REQUEST;
case "POST_ATTRIBUTES":
return MsgType.POST_ATTRIBUTES_REQUEST;
return SessionMsgType.POST_ATTRIBUTES_REQUEST;
case "POST_TELEMETRY":
return MsgType.POST_TELEMETRY_REQUEST;
return SessionMsgType.POST_TELEMETRY_REQUEST;
case "RPC_REQUEST":
return MsgType.TO_SERVER_RPC_REQUEST;
return SessionMsgType.TO_SERVER_RPC_REQUEST;
default:
throw new InvalidParameterException("Can't map " + type + " to " + MsgType.class.getName() + "!");
throw new InvalidParameterException("Can't map " + type + " to " + SessionMsgType.class.getName() + "!");
}
}).collect(Collectors.toList());
}
@Override
public boolean filter(RuleContext ctx, ToDeviceActorMsg msg) {
for (MsgType msgType : msgTypes) {
if (msgType == msg.getPayload().getMsgType()) {
public boolean filter(RuleContext ctx, DeviceToDeviceActorMsg msg) {
for (SessionMsgType sessionMsgType : sessionMsgTypes) {
if (sessionMsgType == msg.getPayload().getMsgType()) {
return true;
}
}

4
extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java

@ -22,7 +22,7 @@ import org.apache.velocity.VelocityContext;
import org.apache.velocity.runtime.parser.ParseException;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.extensions.api.component.Processor;
import org.thingsboard.server.extensions.api.rules.*;
import org.thingsboard.server.extensions.core.utils.VelocityUtils;
@ -57,7 +57,7 @@ public class AlarmDeduplicationProcessor extends SimpleRuleLifecycleComponent
}
@Override
public RuleProcessingMetaData process(RuleContext ctx, ToDeviceActorMsg msg) throws RuleException {
public RuleProcessingMetaData process(RuleContext ctx, DeviceToDeviceActorMsg msg) throws RuleException {
RuleProcessingMetaData md = new RuleProcessingMetaData();
VelocityContext context = VelocityUtils.createContext(ctx.getDeviceMetaData(), msg.getPayload());
String alarmId = VelocityUtils.merge(alarmIdTemplate, context);

4
extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java

@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.kv.KvEntry;
import org.thingsboard.server.common.msg.core.TelemetryUploadRequest;
import org.thingsboard.server.common.msg.core.UpdateAttributesRequest;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceMsg;
import org.thingsboard.server.extensions.api.component.Processor;
import org.thingsboard.server.extensions.api.rules.RuleContext;
@ -102,7 +102,7 @@ public class AlarmProcessor implements RuleProcessor<AlarmProcessorConfiguration
}
@Override
public RuleProcessingMetaData process(RuleContext ctx, ToDeviceActorMsg wrapper) throws RuleException {
public RuleProcessingMetaData process(RuleContext ctx, DeviceToDeviceActorMsg wrapper) throws RuleException {
RuleProcessingMetaData md = new RuleProcessingMetaData();
FromDeviceMsg msg = wrapper.getPayload();

5
extensions/extension-kafka/src/main/java/org/thingsboard/server/extensions/kafka/action/KafkaActionPayload.java

@ -17,7 +17,8 @@ package org.thingsboard.server.extensions.kafka.action;
import lombok.Builder;
import lombok.Data;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.io.Serializable;
@ -30,5 +31,5 @@ public class KafkaActionPayload implements Serializable {
private final boolean sync;
private final Integer requestId;
private final MsgType msgType;
private final SessionMsgType sessionMsgType;
}

4
extensions/extension-kafka/src/main/java/org/thingsboard/server/extensions/kafka/action/KafkaPluginAction.java

@ -16,7 +16,7 @@
package org.thingsboard.server.extensions.kafka.action;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
@ -30,7 +30,7 @@ import java.util.Optional;
public class KafkaPluginAction extends AbstractTemplatePluginAction<KafkaPluginActionConfiguration> {
@Override
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, ToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, DeviceToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
KafkaActionPayload.KafkaActionPayloadBuilder builder = KafkaActionPayload.builder();
builder.msgType(payload.getMsgType());
builder.requestId(payload.getRequestId());

4
extensions/extension-mqtt/src/main/java/org/thingsboard/server/extensions/mqtt/action/MqttActionPayload.java

@ -17,7 +17,7 @@ package org.thingsboard.server.extensions.mqtt.action;
import lombok.Builder;
import lombok.Data;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.io.Serializable;
@ -30,5 +30,5 @@ public class MqttActionPayload implements Serializable {
private final String msgBody;
private final Integer requestId;
private final MsgType msgType;
private final SessionMsgType sessionMsgType;
}

4
extensions/extension-mqtt/src/main/java/org/thingsboard/server/extensions/mqtt/action/MqttPluginAction.java

@ -15,7 +15,7 @@
*/
package org.thingsboard.server.extensions.mqtt.action;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
@ -28,7 +28,7 @@ import java.util.Optional;
public class MqttPluginAction extends AbstractTemplatePluginAction<MqttPluginActionConfiguration> {
@Override
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, ToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, DeviceToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
MqttActionPayload.MqttActionPayloadBuilder builder = MqttActionPayload.builder();
builder.sync(configuration.isSync());
builder.msgType(payload.getMsgType());

4
extensions/extension-rabbitmq/src/main/java/org/thingsboard/server/extensions/rabbitmq/action/RabbitMqActionPayload.java

@ -17,7 +17,7 @@ package org.thingsboard.server.extensions.rabbitmq.action;
import lombok.Builder;
import lombok.Data;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.io.Serializable;
@ -35,5 +35,5 @@ public class RabbitMqActionPayload implements Serializable {
private final boolean sync;
private final Integer requestId;
private final MsgType msgType;
private final SessionMsgType sessionMsgType;
}

4
extensions/extension-rabbitmq/src/main/java/org/thingsboard/server/extensions/rabbitmq/action/RabbitMqPluginAction.java

@ -15,7 +15,7 @@
*/
package org.thingsboard.server.extensions.rabbitmq.action;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
@ -32,7 +32,7 @@ import java.util.Optional;
public class RabbitMqPluginAction extends AbstractTemplatePluginAction<RabbitMqPluginActionConfiguration> {
@Override
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, ToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, DeviceToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
RabbitMqActionPayload.RabbitMqActionPayloadBuilder builder = RabbitMqActionPayload.builder();
builder.sync(configuration.isSync());
builder.exchange(configuration.getExchange());

5
extensions/extension-rest-api-call/src/main/java/org/thingsboard/server/extensions/rest/action/RestApiCallActionPayload.java

@ -19,7 +19,8 @@ import lombok.Builder;
import lombok.Data;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.io.Serializable;
@ -33,5 +34,5 @@ public class RestApiCallActionPayload implements Serializable {
private final boolean sync;
private final Integer requestId;
private final MsgType msgType;
private final SessionMsgType sessionMsgType;
}

4
extensions/extension-rest-api-call/src/main/java/org/thingsboard/server/extensions/rest/action/RestApiCallPluginAction.java

@ -18,7 +18,7 @@ package org.thingsboard.server.extensions.rest.action;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
@ -33,7 +33,7 @@ import java.util.Optional;
public class RestApiCallPluginAction extends AbstractTemplatePluginAction<RestApiCallPluginActionConfiguration> {
@Override
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, ToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, DeviceToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
RestApiCallActionPayload.RestApiCallActionPayloadBuilder builder = RestApiCallActionPayload.builder();
builder.msgType(payload.getMsgType());
builder.requestId(payload.getRequestId());

4
extensions/extension-sns/src/main/java/org/thingsboard/server/extensions/sns/action/SnsTopicActionPayload.java

@ -17,7 +17,7 @@ package org.thingsboard.server.extensions.sns.action;
import lombok.Builder;
import lombok.Data;
import org.thingsboard.server.common.msg.session.MsgType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.io.Serializable;
@ -32,6 +32,6 @@ public class SnsTopicActionPayload implements Serializable {
private final String msgBody;
private final Integer requestId;
private final MsgType msgType;
private final SessionMsgType sessionMsgType;
private final boolean sync;
}

4
extensions/extension-sns/src/main/java/org/thingsboard/server/extensions/sns/action/SnsTopicPluginAction.java

@ -15,7 +15,7 @@
*/
package org.thingsboard.server.extensions.sns.action;
import org.thingsboard.server.common.msg.device.ToDeviceActorMsg;
import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg;
import org.thingsboard.server.common.msg.session.FromDeviceRequestMsg;
import org.thingsboard.server.extensions.api.component.Action;
import org.thingsboard.server.extensions.api.plugins.msg.RuleToPluginMsg;
@ -31,7 +31,7 @@ import java.util.Optional;
public class SnsTopicPluginAction extends AbstractTemplatePluginAction<SnsTopicPluginActionConfiguration> {
@Override
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, ToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
protected Optional<RuleToPluginMsg> buildRuleToPluginMsg(RuleContext ctx, DeviceToDeviceActorMsg msg, FromDeviceRequestMsg payload) {
SnsTopicActionPayload.SnsTopicActionPayloadBuilder builder = SnsTopicActionPayload.builder();
builder.msgType(payload.getMsgType());
builder.requestId(payload.getRequestId());

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save