Showing
31 changed files
with
425 additions
and
517 deletions
@@ -60,6 +60,7 @@ import org.thingsboard.server.service.cluster.discovery.DiscoveryService; | @@ -60,6 +60,7 @@ import org.thingsboard.server.service.cluster.discovery.DiscoveryService; | ||
60 | import org.thingsboard.server.service.cluster.routing.ClusterRoutingService; | 60 | import org.thingsboard.server.service.cluster.routing.ClusterRoutingService; |
61 | import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; | 61 | import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; |
62 | import org.thingsboard.server.service.component.ComponentDiscoveryService; | 62 | import org.thingsboard.server.service.component.ComponentDiscoveryService; |
63 | +import org.thingsboard.server.service.encoding.DataDecodingEncodingService; | ||
63 | import org.thingsboard.server.service.executors.DbCallbackExecutorService; | 64 | import org.thingsboard.server.service.executors.DbCallbackExecutorService; |
64 | import org.thingsboard.server.service.executors.ExternalCallExecutorService; | 65 | import org.thingsboard.server.service.executors.ExternalCallExecutorService; |
65 | import org.thingsboard.server.service.mail.MailExecutorService; | 66 | import org.thingsboard.server.service.mail.MailExecutorService; |
@@ -103,6 +104,10 @@ public class ActorSystemContext { | @@ -103,6 +104,10 @@ public class ActorSystemContext { | ||
103 | 104 | ||
104 | @Autowired | 105 | @Autowired |
105 | @Getter | 106 | @Getter |
107 | + private DataDecodingEncodingService encodingService; | ||
108 | + | ||
109 | + @Autowired | ||
110 | + @Getter | ||
106 | private DeviceAuthService deviceAuthService; | 111 | private DeviceAuthService deviceAuthService; |
107 | 112 | ||
108 | @Autowired | 113 | @Autowired |
@@ -34,6 +34,8 @@ import org.thingsboard.server.common.data.page.PageDataIterable; | @@ -34,6 +34,8 @@ import org.thingsboard.server.common.data.page.PageDataIterable; | ||
34 | import org.thingsboard.server.common.msg.TbActorMsg; | 34 | import org.thingsboard.server.common.msg.TbActorMsg; |
35 | import org.thingsboard.server.common.msg.aware.DeviceAwareMsg; | 35 | import org.thingsboard.server.common.msg.aware.DeviceAwareMsg; |
36 | import org.thingsboard.server.common.msg.aware.TenantAwareMsg; | 36 | import org.thingsboard.server.common.msg.aware.TenantAwareMsg; |
37 | +import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | ||
38 | +import org.thingsboard.server.common.msg.cluster.ServerAddress; | ||
37 | import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg; | 39 | import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg; |
38 | import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; | 40 | import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; |
39 | import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg; | 41 | import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg; |
@@ -45,6 +47,7 @@ import scala.concurrent.duration.Duration; | @@ -45,6 +47,7 @@ import scala.concurrent.duration.Duration; | ||
45 | 47 | ||
46 | import java.util.HashMap; | 48 | import java.util.HashMap; |
47 | import java.util.Map; | 49 | import java.util.Map; |
50 | +import java.util.Optional; | ||
48 | 51 | ||
49 | public class AppActor extends RuleChainManagerActor { | 52 | public class AppActor extends RuleChainManagerActor { |
50 | 53 | ||
@@ -89,6 +92,9 @@ public class AppActor extends RuleChainManagerActor { | @@ -89,6 +92,9 @@ public class AppActor extends RuleChainManagerActor { | ||
89 | @Override | 92 | @Override |
90 | protected boolean process(TbActorMsg msg) { | 93 | protected boolean process(TbActorMsg msg) { |
91 | switch (msg.getMsgType()) { | 94 | switch (msg.getMsgType()) { |
95 | + case SEND_TO_CLUSTER_MSG: | ||
96 | + onPossibleClusterMsg((SendToClusterMsg) msg); | ||
97 | + break; | ||
92 | case CLUSTER_EVENT_MSG: | 98 | case CLUSTER_EVENT_MSG: |
93 | broadcast(msg); | 99 | broadcast(msg); |
94 | break; | 100 | break; |
@@ -112,6 +118,16 @@ public class AppActor extends RuleChainManagerActor { | @@ -112,6 +118,16 @@ public class AppActor extends RuleChainManagerActor { | ||
112 | return true; | 118 | return true; |
113 | } | 119 | } |
114 | 120 | ||
121 | + private void onPossibleClusterMsg(SendToClusterMsg msg) { | ||
122 | + Optional<ServerAddress> address = systemContext.getRoutingService().resolveById(msg.getEntityId()); | ||
123 | + if (address.isPresent()) { | ||
124 | + systemContext.getRpcService().tell( | ||
125 | + systemContext.getEncodingService().convertToProtoDataMessage(address.get(), msg.getMsg())); | ||
126 | + } else { | ||
127 | + self().tell(msg.getMsg(), ActorRef.noSender()); | ||
128 | + } | ||
129 | + } | ||
130 | + | ||
115 | private void onServiceToRuleEngineMsg(ServiceToRuleEngineMsg msg) { | 131 | private void onServiceToRuleEngineMsg(ServiceToRuleEngineMsg msg) { |
116 | if (SYSTEM_TENANT.equals(msg.getTenantId())) { | 132 | if (SYSTEM_TENANT.equals(msg.getTenantId())) { |
117 | //TODO: ashvayka handle this. | 133 | //TODO: ashvayka handle this. |
@@ -74,6 +74,7 @@ import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotific | @@ -74,6 +74,7 @@ import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotific | ||
74 | import org.thingsboard.server.extensions.api.device.DeviceNameOrTypeUpdateMsg; | 74 | import org.thingsboard.server.extensions.api.device.DeviceNameOrTypeUpdateMsg; |
75 | import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse; | 75 | import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse; |
76 | import org.thingsboard.server.extensions.api.plugins.msg.RpcError; | 76 | import org.thingsboard.server.extensions.api.plugins.msg.RpcError; |
77 | +import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | ||
77 | import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; | 78 | import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; |
78 | import org.thingsboard.server.service.rpc.ToServerRpcResponseActorMsg; | 79 | import org.thingsboard.server.service.rpc.ToServerRpcResponseActorMsg; |
79 | 80 | ||
@@ -521,7 +522,8 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso | @@ -521,7 +522,8 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso | ||
521 | if (sessionAddress.isPresent()) { | 522 | if (sessionAddress.isPresent()) { |
522 | ServerAddress address = sessionAddress.get(); | 523 | ServerAddress address = sessionAddress.get(); |
523 | logger.debug("{} Forwarding msg: {}", address, response); | 524 | logger.debug("{} Forwarding msg: {}", address, response); |
524 | - systemContext.getRpcService().tell(sessionAddress.get(), response); | 525 | + systemContext.getRpcService().tell(systemContext.getEncodingService() |
526 | + .convertToProtoDataMessage(sessionAddress.get(), response)); | ||
525 | } else { | 527 | } else { |
526 | systemContext.getSessionManagerActor().tell(response, ActorRef.noSender()); | 528 | systemContext.getSessionManagerActor().tell(response, ActorRef.noSender()); |
527 | } | 529 | } |
@@ -82,7 +82,8 @@ public final class PluginProcessingContext implements PluginContext { | @@ -82,7 +82,8 @@ public final class PluginProcessingContext implements PluginContext { | ||
82 | 82 | ||
83 | @Override | 83 | @Override |
84 | public void sendPluginRpcMsg(RpcMsg msg) { | 84 | public void sendPluginRpcMsg(RpcMsg msg) { |
85 | - this.pluginCtx.rpcService.tell(new PluginRpcMsg(pluginCtx.tenantId, pluginCtx.pluginId, msg)); | 85 | + //ToDO is this a cluster messsage? |
86 | +// this.pluginCtx.rpcService.tell(new PluginRpcMsg(pluginCtx.tenantId, pluginCtx.pluginId, msg)); | ||
86 | } | 87 | } |
87 | 88 | ||
88 | @Override | 89 | @Override |
@@ -21,6 +21,7 @@ import org.thingsboard.server.actors.ActorSystemContext; | @@ -21,6 +21,7 @@ import org.thingsboard.server.actors.ActorSystemContext; | ||
21 | import org.thingsboard.server.common.data.id.DeviceId; | 21 | import org.thingsboard.server.common.data.id.DeviceId; |
22 | import org.thingsboard.server.common.data.id.PluginId; | 22 | import org.thingsboard.server.common.data.id.PluginId; |
23 | import org.thingsboard.server.common.data.id.TenantId; | 23 | import org.thingsboard.server.common.data.id.TenantId; |
24 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
24 | import org.thingsboard.server.common.msg.cluster.ServerAddress; | 25 | import org.thingsboard.server.common.msg.cluster.ServerAddress; |
25 | import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; | 26 | import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; |
26 | import org.thingsboard.server.common.msg.timeout.TimeoutMsg; | 27 | import org.thingsboard.server.common.msg.timeout.TimeoutMsg; |
@@ -100,7 +101,7 @@ public final class SharedPluginProcessingContext { | @@ -100,7 +101,7 @@ public final class SharedPluginProcessingContext { | ||
100 | } | 101 | } |
101 | 102 | ||
102 | public void toDeviceActor(DeviceAttributesEventNotificationMsg msg) { | 103 | public void toDeviceActor(DeviceAttributesEventNotificationMsg msg) { |
103 | - forward(msg.getDeviceId(), msg, rpcService::tell); | 104 | + forward(msg.getDeviceId(), msg); |
104 | } | 105 | } |
105 | 106 | ||
106 | public void sendRpcRequest(ToDeviceRpcRequest msg) { | 107 | public void sendRpcRequest(ToDeviceRpcRequest msg) { |
@@ -109,11 +110,11 @@ public final class SharedPluginProcessingContext { | @@ -109,11 +110,11 @@ public final class SharedPluginProcessingContext { | ||
109 | // forward(msg.getDeviceId(), rpcMsg, rpcService::tell); | 110 | // forward(msg.getDeviceId(), rpcMsg, rpcService::tell); |
110 | } | 111 | } |
111 | 112 | ||
112 | - private <T> void forward(DeviceId deviceId, T msg, BiConsumer<ServerAddress, T> rpcFunction) { | 113 | + private <T extends TbActorMsg> void forward(DeviceId deviceId, T msg) { |
113 | Optional<ServerAddress> instance = routingService.resolveById(deviceId); | 114 | Optional<ServerAddress> instance = routingService.resolveById(deviceId); |
114 | if (instance.isPresent()) { | 115 | if (instance.isPresent()) { |
115 | log.trace("[{}] Forwarding msg {} to remote device actor!", pluginId, msg); | 116 | log.trace("[{}] Forwarding msg {} to remote device actor!", pluginId, msg); |
116 | - rpcFunction.accept(instance.get(), msg); | 117 | + rpcService.tell(systemContext.getEncodingService().convertToProtoDataMessage(instance.get(), msg)); |
117 | } else { | 118 | } else { |
118 | log.trace("[{}] Forwarding msg {} to local device actor!", pluginId, msg); | 119 | log.trace("[{}] Forwarding msg {} to local device actor!", pluginId, msg); |
119 | parentActor.tell(msg, ActorRef.noSender()); | 120 | parentActor.tell(msg, ActorRef.noSender()); |
@@ -17,30 +17,11 @@ package org.thingsboard.server.actors.rpc; | @@ -17,30 +17,11 @@ package org.thingsboard.server.actors.rpc; | ||
17 | 17 | ||
18 | import akka.actor.ActorRef; | 18 | import akka.actor.ActorRef; |
19 | import lombok.extern.slf4j.Slf4j; | 19 | import lombok.extern.slf4j.Slf4j; |
20 | -import org.springframework.util.SerializationUtils; | ||
21 | -import org.springframework.util.StringUtils; | ||
22 | import org.thingsboard.server.actors.ActorSystemContext; | 20 | import org.thingsboard.server.actors.ActorSystemContext; |
23 | import org.thingsboard.server.actors.service.ActorService; | 21 | import org.thingsboard.server.actors.service.ActorService; |
24 | -import org.thingsboard.server.common.data.id.DeviceId; | ||
25 | -import org.thingsboard.server.common.data.id.PluginId; | ||
26 | -import org.thingsboard.server.common.data.id.TenantId; | ||
27 | -import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; | ||
28 | -import org.thingsboard.server.common.msg.cluster.ServerAddress; | ||
29 | -import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; | ||
30 | -import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; | ||
31 | -import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg; | ||
32 | -import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; | ||
33 | -import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg; | ||
34 | -import org.thingsboard.server.extensions.api.plugins.msg.*; | ||
35 | -import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg; | ||
36 | -import org.thingsboard.server.extensions.api.plugins.rpc.RpcMsg; | ||
37 | import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | 22 | import org.thingsboard.server.gen.cluster.ClusterAPIProtos; |
38 | import org.thingsboard.server.service.cluster.rpc.GrpcSession; | 23 | import org.thingsboard.server.service.cluster.rpc.GrpcSession; |
39 | import org.thingsboard.server.service.cluster.rpc.GrpcSessionListener; | 24 | import org.thingsboard.server.service.cluster.rpc.GrpcSessionListener; |
40 | -import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; | ||
41 | - | ||
42 | -import java.io.Serializable; | ||
43 | -import java.util.UUID; | ||
44 | 25 | ||
45 | /** | 26 | /** |
46 | * @author Andrew Shvayka | 27 | * @author Andrew Shvayka |
@@ -76,48 +57,13 @@ public class BasicRpcSessionListener implements GrpcSessionListener { | @@ -76,48 +57,13 @@ public class BasicRpcSessionListener implements GrpcSessionListener { | ||
76 | } | 57 | } |
77 | 58 | ||
78 | @Override | 59 | @Override |
79 | - public void onToPluginRpcMsg(GrpcSession session, ClusterAPIProtos.ToPluginRpcMessage msg) { | ||
80 | - if (log.isTraceEnabled()) { | ||
81 | - log.trace("{} session [{}] received plugin msg {}", getType(session), session.getRemoteServer(), msg); | ||
82 | - } | ||
83 | - service.onMsg(convert(session.getRemoteServer(), msg)); | ||
84 | - } | ||
85 | - | ||
86 | - @Override | ||
87 | - public void onToDeviceActorRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceActorRpcMessage msg) { | ||
88 | - log.trace("{} session [{}] received device actor msg {}", getType(session), session.getRemoteServer(), msg); | ||
89 | - service.onMsg((DeviceToDeviceActorMsg) deserialize(msg.getData().toByteArray())); | ||
90 | - } | ||
91 | - | ||
92 | - @Override | ||
93 | - public void onToDeviceActorNotificationRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceActorNotificationRpcMessage msg) { | ||
94 | - log.trace("{} session [{}] received device actor notification msg {}", getType(session), session.getRemoteServer(), msg); | ||
95 | - service.onMsg((ToDeviceActorNotificationMsg) deserialize(msg.getData().toByteArray())); | ||
96 | - } | ||
97 | - | ||
98 | - @Override | ||
99 | - public void onToDeviceSessionActorRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceSessionActorRpcMessage msg) { | ||
100 | - log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | ||
101 | - service.onMsg((ToDeviceSessionActorMsg) deserialize(msg.getData().toByteArray())); | ||
102 | - } | ||
103 | - | ||
104 | - @Override | ||
105 | - public void onToDeviceRpcRequestRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceRpcRequestRpcMessage msg) { | ||
106 | - log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | ||
107 | - service.onMsg(deserialize(session.getRemoteServer(), msg)); | ||
108 | - } | ||
109 | - | ||
110 | - @Override | ||
111 | - public void onFromDeviceRpcResponseRpcMsg(GrpcSession session, ClusterAPIProtos.ToPluginRpcResponseRpcMessage msg) { | ||
112 | - log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | ||
113 | - service.onMsg(deserialize(session.getRemoteServer(), msg)); | 60 | + public void onReceiveClusterGrpcMsg(GrpcSession session, ClusterAPIProtos.ClusterMessage clusterMessage) { |
61 | + log.trace("{} Service [{}] received session actor msg {}", getType(session), | ||
62 | + session.getRemoteServer(), | ||
63 | + clusterMessage); | ||
64 | + service.onRecievedMsg(clusterMessage); | ||
114 | } | 65 | } |
115 | 66 | ||
116 | - @Override | ||
117 | - public void onToAllNodesRpcMessage(GrpcSession session, ClusterAPIProtos.ToAllNodesRpcMessage msg) { | ||
118 | - log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | ||
119 | - service.onMsg((ToAllNodesMsg) deserialize(msg.getData().toByteArray())); | ||
120 | - } | ||
121 | 67 | ||
122 | @Override | 68 | @Override |
123 | public void onError(GrpcSession session, Throwable t) { | 69 | public void onError(GrpcSession session, Throwable t) { |
@@ -130,37 +76,5 @@ public class BasicRpcSessionListener implements GrpcSessionListener { | @@ -130,37 +76,5 @@ public class BasicRpcSessionListener implements GrpcSessionListener { | ||
130 | return session.isClient() ? "Client" : "Server"; | 76 | return session.isClient() ? "Client" : "Server"; |
131 | } | 77 | } |
132 | 78 | ||
133 | - private static PluginRpcMsg convert(ServerAddress serverAddress, ClusterAPIProtos.ToPluginRpcMessage msg) { | ||
134 | - ClusterAPIProtos.PluginAddress address = msg.getAddress(); | ||
135 | - TenantId tenantId = new TenantId(toUUID(address.getTenantId())); | ||
136 | - PluginId pluginId = new PluginId(toUUID(address.getPluginId())); | ||
137 | - RpcMsg rpcMsg = new RpcMsg(serverAddress, msg.getClazz(), msg.getData().toByteArray()); | ||
138 | - return new PluginRpcMsg(tenantId, pluginId, rpcMsg); | ||
139 | - } | ||
140 | - | ||
141 | - private static UUID toUUID(ClusterAPIProtos.Uid uid) { | ||
142 | - return new UUID(uid.getPluginUuidMsb(), uid.getPluginUuidLsb()); | ||
143 | - } | ||
144 | - | ||
145 | - private static ToDeviceRpcRequestActorMsg deserialize(ServerAddress serverAddress, ClusterAPIProtos.ToDeviceRpcRequestRpcMessage msg) { | ||
146 | - TenantId deviceTenantId = new TenantId(toUUID(msg.getDeviceTenantId())); | ||
147 | - DeviceId deviceId = new DeviceId(toUUID(msg.getDeviceId())); | ||
148 | - | ||
149 | - ToDeviceRpcRequestBody requestBody = new ToDeviceRpcRequestBody(msg.getMethod(), msg.getParams()); | ||
150 | - ToDeviceRpcRequest request = new ToDeviceRpcRequest(toUUID(msg.getMsgId()), deviceTenantId, deviceId, msg.getOneway(), msg.getExpTime(), requestBody); | ||
151 | - | ||
152 | - return new ToDeviceRpcRequestActorMsg(serverAddress, request); | ||
153 | - } | ||
154 | - | ||
155 | - private static ToPluginRpcResponseDeviceMsg deserialize(ServerAddress serverAddress, ClusterAPIProtos.ToPluginRpcResponseRpcMessage msg) { | ||
156 | - RpcError error = !StringUtils.isEmpty(msg.getError()) ? RpcError.valueOf(msg.getError()) : null; | ||
157 | - FromDeviceRpcResponse response = new FromDeviceRpcResponse(toUUID(msg.getMsgId()), msg.getResponse(), error); | ||
158 | - return new ToPluginRpcResponseDeviceMsg(null, null, response); | ||
159 | - } | ||
160 | - | ||
161 | - @SuppressWarnings("unchecked") | ||
162 | - private static <T extends Serializable> T deserialize(byte[] data) { | ||
163 | - return (T) SerializationUtils.deserialize(data); | ||
164 | - } | ||
165 | 79 | ||
166 | } | 80 | } |
@@ -23,5 +23,5 @@ import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | @@ -23,5 +23,5 @@ import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | ||
23 | */ | 23 | */ |
24 | @Data | 24 | @Data |
25 | public final class RpcBroadcastMsg { | 25 | public final class RpcBroadcastMsg { |
26 | - private final ClusterAPIProtos.ToRpcServerMessage msg; | 26 | + private final ClusterAPIProtos.ClusterMessage msg; |
27 | } | 27 | } |
@@ -40,7 +40,7 @@ public class RpcManagerActor extends ContextAwareActor { | @@ -40,7 +40,7 @@ public class RpcManagerActor extends ContextAwareActor { | ||
40 | 40 | ||
41 | private final Map<ServerAddress, SessionActorInfo> sessionActors; | 41 | private final Map<ServerAddress, SessionActorInfo> sessionActors; |
42 | 42 | ||
43 | - private final Map<ServerAddress, Queue<ClusterAPIProtos.ToRpcServerMessage>> pendingMsgs; | 43 | + private final Map<ServerAddress, Queue<ClusterAPIProtos.ClusterMessage>> pendingMsgs; |
44 | 44 | ||
45 | private final ServerAddress instance; | 45 | private final ServerAddress instance; |
46 | 46 | ||
@@ -65,8 +65,8 @@ public class RpcManagerActor extends ContextAwareActor { | @@ -65,8 +65,8 @@ public class RpcManagerActor extends ContextAwareActor { | ||
65 | 65 | ||
66 | @Override | 66 | @Override |
67 | public void onReceive(Object msg) throws Exception { | 67 | public void onReceive(Object msg) throws Exception { |
68 | - if (msg instanceof RpcSessionTellMsg) { | ||
69 | - onMsg((RpcSessionTellMsg) msg); | 68 | + if (msg instanceof ClusterAPIProtos.ClusterMessage) { |
69 | + onMsg((ClusterAPIProtos.ClusterMessage) msg); | ||
70 | } else if (msg instanceof RpcBroadcastMsg) { | 70 | } else if (msg instanceof RpcBroadcastMsg) { |
71 | onMsg((RpcBroadcastMsg) msg); | 71 | onMsg((RpcBroadcastMsg) msg); |
72 | } else if (msg instanceof RpcSessionCreateRequestMsg) { | 72 | } else if (msg instanceof RpcSessionCreateRequestMsg) { |
@@ -84,27 +84,32 @@ public class RpcManagerActor extends ContextAwareActor { | @@ -84,27 +84,32 @@ public class RpcManagerActor extends ContextAwareActor { | ||
84 | 84 | ||
85 | private void onMsg(RpcBroadcastMsg msg) { | 85 | private void onMsg(RpcBroadcastMsg msg) { |
86 | log.debug("Forwarding msg to session actors {}", msg); | 86 | log.debug("Forwarding msg to session actors {}", msg); |
87 | - sessionActors.keySet().forEach(address -> onMsg(new RpcSessionTellMsg(address, msg.getMsg()))); | 87 | + sessionActors.keySet().forEach(address -> onMsg(msg.getMsg())); |
88 | pendingMsgs.values().forEach(queue -> queue.add(msg.getMsg())); | 88 | pendingMsgs.values().forEach(queue -> queue.add(msg.getMsg())); |
89 | } | 89 | } |
90 | 90 | ||
91 | - private void onMsg(RpcSessionTellMsg msg) { | ||
92 | - ServerAddress address = msg.getServerAddress(); | ||
93 | - SessionActorInfo session = sessionActors.get(address); | ||
94 | - if (session != null) { | ||
95 | - log.debug("{} Forwarding msg to session actor", address); | ||
96 | - session.actor.tell(msg, ActorRef.noSender()); | ||
97 | - } else { | ||
98 | - log.debug("{} Storing msg to pending queue", address); | ||
99 | - Queue<ClusterAPIProtos.ToRpcServerMessage> queue = pendingMsgs.get(address); | ||
100 | - if (queue == null) { | ||
101 | - queue = new LinkedList<>(); | ||
102 | - pendingMsgs.put(address, queue); | 91 | + private void onMsg(ClusterAPIProtos.ClusterMessage msg) { |
92 | + if (msg.hasServerAdresss()) { | ||
93 | + ServerAddress address = new ServerAddress(msg.getServerAdresss().getHost(), | ||
94 | + msg.getServerAdresss().getPort()); | ||
95 | + SessionActorInfo session = sessionActors.get(address); | ||
96 | + if (session != null) { | ||
97 | + log.debug("{} Forwarding msg to session actor", address); | ||
98 | + session.getActor().tell(msg, ActorRef.noSender()); | ||
99 | + } else { | ||
100 | + log.debug("{} Storing msg to pending queue", address); | ||
101 | + Queue<ClusterAPIProtos.ClusterMessage> queue = pendingMsgs.get(address); | ||
102 | + if (queue == null) { | ||
103 | + queue = new LinkedList<>(); | ||
104 | + pendingMsgs.put(new ServerAddress( | ||
105 | + msg.getServerAdresss().getHost(), msg.getServerAdresss().getPort()), queue); | ||
106 | + } | ||
107 | + queue.add(msg); | ||
103 | } | 108 | } |
104 | - queue.add(msg.getMsg()); | 109 | + } else { |
110 | + logger.warning("Cluster msg doesn't have set Server Address [{}]", msg); | ||
105 | } | 111 | } |
106 | } | 112 | } |
107 | - | ||
108 | @Override | 113 | @Override |
109 | public void postStop() { | 114 | public void postStop() { |
110 | sessionActors.clear(); | 115 | sessionActors.clear(); |
@@ -167,10 +172,10 @@ public class RpcManagerActor extends ContextAwareActor { | @@ -167,10 +172,10 @@ public class RpcManagerActor extends ContextAwareActor { | ||
167 | private void register(ServerAddress remoteAddress, UUID uuid, ActorRef sender) { | 172 | private void register(ServerAddress remoteAddress, UUID uuid, ActorRef sender) { |
168 | sessionActors.put(remoteAddress, new SessionActorInfo(uuid, sender)); | 173 | sessionActors.put(remoteAddress, new SessionActorInfo(uuid, sender)); |
169 | log.debug("[{}][{}] Registering session actor.", remoteAddress, uuid); | 174 | log.debug("[{}][{}] Registering session actor.", remoteAddress, uuid); |
170 | - Queue<ClusterAPIProtos.ToRpcServerMessage> data = pendingMsgs.remove(remoteAddress); | 175 | + Queue<ClusterAPIProtos.ClusterMessage> data = pendingMsgs.remove(remoteAddress); |
171 | if (data != null) { | 176 | if (data != null) { |
172 | log.debug("[{}][{}] Forwarding {} pending messages.", remoteAddress, uuid, data.size()); | 177 | log.debug("[{}][{}] Forwarding {} pending messages.", remoteAddress, uuid, data.size()); |
173 | - data.forEach(msg -> sender.tell(new RpcSessionTellMsg(remoteAddress, msg), ActorRef.noSender())); | 178 | + data.forEach(msg -> sender.tell(new RpcSessionTellMsg(msg), ActorRef.noSender())); |
174 | } else { | 179 | } else { |
175 | log.debug("[{}][{}] No pending messages to forward.", remoteAddress, uuid); | 180 | log.debug("[{}][{}] No pending messages to forward.", remoteAddress, uuid); |
176 | } | 181 | } |
@@ -32,6 +32,8 @@ import org.thingsboard.server.service.cluster.rpc.GrpcSessionListener; | @@ -32,6 +32,8 @@ import org.thingsboard.server.service.cluster.rpc.GrpcSessionListener; | ||
32 | 32 | ||
33 | import java.util.UUID; | 33 | import java.util.UUID; |
34 | 34 | ||
35 | +import static org.thingsboard.server.gen.cluster.ClusterAPIProtos.MessageType.CONNECT_RPC_MESSAGE; | ||
36 | + | ||
35 | /** | 37 | /** |
36 | * @author Andrew Shvayka | 38 | * @author Andrew Shvayka |
37 | */ | 39 | */ |
@@ -56,15 +58,15 @@ public class RpcSessionActor extends ContextAwareActor { | @@ -56,15 +58,15 @@ public class RpcSessionActor extends ContextAwareActor { | ||
56 | 58 | ||
57 | @Override | 59 | @Override |
58 | public void onReceive(Object msg) throws Exception { | 60 | public void onReceive(Object msg) throws Exception { |
59 | - if (msg instanceof RpcSessionTellMsg) { | ||
60 | - tell((RpcSessionTellMsg) msg); | 61 | + if (msg instanceof ClusterAPIProtos.ClusterMessage) { |
62 | + tell((ClusterAPIProtos.ClusterMessage) msg); | ||
61 | } else if (msg instanceof RpcSessionCreateRequestMsg) { | 63 | } else if (msg instanceof RpcSessionCreateRequestMsg) { |
62 | initSession((RpcSessionCreateRequestMsg) msg); | 64 | initSession((RpcSessionCreateRequestMsg) msg); |
63 | } | 65 | } |
64 | } | 66 | } |
65 | 67 | ||
66 | - private void tell(RpcSessionTellMsg msg) { | ||
67 | - session.sendMsg(msg.getMsg()); | 68 | + private void tell(ClusterAPIProtos.ClusterMessage msg) { |
69 | + session.sendMsg(msg); | ||
68 | } | 70 | } |
69 | 71 | ||
70 | @Override | 72 | @Override |
@@ -91,7 +93,7 @@ public class RpcSessionActor extends ContextAwareActor { | @@ -91,7 +93,7 @@ public class RpcSessionActor extends ContextAwareActor { | ||
91 | session.initInputStream(); | 93 | session.initInputStream(); |
92 | 94 | ||
93 | ClusterRpcServiceGrpc.ClusterRpcServiceStub stub = ClusterRpcServiceGrpc.newStub(channel); | 95 | ClusterRpcServiceGrpc.ClusterRpcServiceStub stub = ClusterRpcServiceGrpc.newStub(channel); |
94 | - StreamObserver<ClusterAPIProtos.ToRpcServerMessage> outputStream = stub.handlePluginMsgs(session.getInputStream()); | 96 | + StreamObserver<ClusterAPIProtos.ClusterMessage> outputStream = stub.handleMsgs(session.getInputStream()); |
95 | 97 | ||
96 | session.setOutputStream(outputStream); | 98 | session.setOutputStream(outputStream); |
97 | session.initOutputStream(); | 99 | session.initOutputStream(); |
@@ -115,11 +117,10 @@ public class RpcSessionActor extends ContextAwareActor { | @@ -115,11 +117,10 @@ public class RpcSessionActor extends ContextAwareActor { | ||
115 | } | 117 | } |
116 | } | 118 | } |
117 | 119 | ||
118 | - private ClusterAPIProtos.ToRpcServerMessage toConnectMsg() { | 120 | + private ClusterAPIProtos.ClusterMessage toConnectMsg() { |
119 | ServerAddress instance = systemContext.getDiscoveryService().getCurrentServer().getServerAddress(); | 121 | ServerAddress instance = systemContext.getDiscoveryService().getCurrentServer().getServerAddress(); |
120 | - return ClusterAPIProtos.ToRpcServerMessage.newBuilder().setConnectMsg( | ||
121 | - ClusterAPIProtos.ConnectRpcMessage.newBuilder().setServerAddress( | ||
122 | - ClusterAPIProtos.ServerAddress.newBuilder().setHost(instance.getHost()).setPort(instance.getPort()).build()).build()).build(); | ||
123 | - | 122 | + return ClusterAPIProtos.ClusterMessage.newBuilder().setMessageType(CONNECT_RPC_MESSAGE).setServerAdresss( |
123 | + ClusterAPIProtos.ServerAddress.newBuilder().setHost(instance.getHost()) | ||
124 | + .setPort(instance.getPort()).build()).build(); | ||
124 | } | 125 | } |
125 | } | 126 | } |
@@ -30,6 +30,6 @@ public final class RpcSessionCreateRequestMsg { | @@ -30,6 +30,6 @@ public final class RpcSessionCreateRequestMsg { | ||
30 | 30 | ||
31 | private final UUID msgUid; | 31 | private final UUID msgUid; |
32 | private final ServerAddress remoteAddress; | 32 | private final ServerAddress remoteAddress; |
33 | - private final StreamObserver<ClusterAPIProtos.ToRpcServerMessage> responseObserver; | 33 | + private final StreamObserver<ClusterAPIProtos.ClusterMessage> responseObserver; |
34 | 34 | ||
35 | } | 35 | } |
@@ -24,6 +24,5 @@ import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | @@ -24,6 +24,5 @@ import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | ||
24 | */ | 24 | */ |
25 | @Data | 25 | @Data |
26 | public final class RpcSessionTellMsg { | 26 | public final class RpcSessionTellMsg { |
27 | - private final ServerAddress serverAddress; | ||
28 | - private final ClusterAPIProtos.ToRpcServerMessage msg; | 27 | + private final ClusterAPIProtos.ClusterMessage msg; |
29 | } | 28 | } |
@@ -18,6 +18,7 @@ package org.thingsboard.server.actors.service; | @@ -18,6 +18,7 @@ package org.thingsboard.server.actors.service; | ||
18 | import org.thingsboard.server.common.data.id.*; | 18 | import org.thingsboard.server.common.data.id.*; |
19 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; | 19 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; |
20 | import org.thingsboard.server.common.msg.TbMsg; | 20 | import org.thingsboard.server.common.msg.TbMsg; |
21 | +import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | ||
21 | import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg; | 22 | import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg; |
22 | import org.thingsboard.server.common.transport.SessionMsgProcessor; | 23 | import org.thingsboard.server.common.transport.SessionMsgProcessor; |
23 | import org.thingsboard.server.service.cluster.discovery.DiscoveryServiceListener; | 24 | import org.thingsboard.server.service.cluster.discovery.DiscoveryServiceListener; |
@@ -27,10 +28,11 @@ public interface ActorService extends SessionMsgProcessor, WebSocketMsgProcessor | @@ -27,10 +28,11 @@ public interface ActorService extends SessionMsgProcessor, WebSocketMsgProcessor | ||
27 | 28 | ||
28 | void onEntityStateChange(TenantId tenantId, EntityId entityId, ComponentLifecycleEvent state); | 29 | void onEntityStateChange(TenantId tenantId, EntityId entityId, ComponentLifecycleEvent state); |
29 | 30 | ||
30 | - void onMsg(ServiceToRuleEngineMsg msg); | 31 | + void onMsg(SendToClusterMsg msg); |
31 | 32 | ||
32 | void onCredentialsUpdate(TenantId tenantId, DeviceId deviceId); | 33 | void onCredentialsUpdate(TenantId tenantId, DeviceId deviceId); |
33 | 34 | ||
34 | void onDeviceNameOrTypeUpdate(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType); | 35 | void onDeviceNameOrTypeUpdate(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType); |
35 | 36 | ||
37 | + void onMsg(ServiceToRuleEngineMsg serviceToRuleEngineMsg); | ||
36 | } | 38 | } |
@@ -19,6 +19,7 @@ import akka.actor.ActorRef; | @@ -19,6 +19,7 @@ import akka.actor.ActorRef; | ||
19 | import akka.actor.ActorSystem; | 19 | import akka.actor.ActorSystem; |
20 | import akka.actor.Props; | 20 | import akka.actor.Props; |
21 | import akka.actor.Terminated; | 21 | import akka.actor.Terminated; |
22 | +import com.google.protobuf.ByteString; | ||
22 | import lombok.extern.slf4j.Slf4j; | 23 | import lombok.extern.slf4j.Slf4j; |
23 | import org.springframework.beans.factory.annotation.Autowired; | 24 | import org.springframework.beans.factory.annotation.Autowired; |
24 | import org.springframework.stereotype.Service; | 25 | import org.springframework.stereotype.Service; |
@@ -32,8 +33,10 @@ import org.thingsboard.server.actors.session.SessionManagerActor; | @@ -32,8 +33,10 @@ import org.thingsboard.server.actors.session.SessionManagerActor; | ||
32 | import org.thingsboard.server.actors.stats.StatsActor; | 33 | import org.thingsboard.server.actors.stats.StatsActor; |
33 | import org.thingsboard.server.common.data.id.*; | 34 | import org.thingsboard.server.common.data.id.*; |
34 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; | 35 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; |
36 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
35 | import org.thingsboard.server.common.msg.aware.SessionAwareMsg; | 37 | import org.thingsboard.server.common.msg.aware.SessionAwareMsg; |
36 | import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; | 38 | import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; |
39 | +import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | ||
37 | import org.thingsboard.server.common.msg.cluster.ServerAddress; | 40 | import org.thingsboard.server.common.msg.cluster.ServerAddress; |
38 | import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; | 41 | import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; |
39 | import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; | 42 | import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; |
@@ -46,6 +49,7 @@ import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg | @@ -46,6 +49,7 @@ import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg | ||
46 | import org.thingsboard.server.extensions.api.plugins.msg.ToPluginActorMsg; | 49 | import org.thingsboard.server.extensions.api.plugins.msg.ToPluginActorMsg; |
47 | import org.thingsboard.server.extensions.api.plugins.rest.PluginRestMsg; | 50 | import org.thingsboard.server.extensions.api.plugins.rest.PluginRestMsg; |
48 | import org.thingsboard.server.extensions.api.plugins.ws.msg.PluginWebsocketMsg; | 51 | import org.thingsboard.server.extensions.api.plugins.ws.msg.PluginWebsocketMsg; |
52 | +import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | ||
49 | import org.thingsboard.server.service.cluster.discovery.DiscoveryService; | 53 | import org.thingsboard.server.service.cluster.discovery.DiscoveryService; |
50 | import org.thingsboard.server.service.cluster.discovery.ServerInstance; | 54 | import org.thingsboard.server.service.cluster.discovery.ServerInstance; |
51 | import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; | 55 | import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; |
@@ -57,6 +61,9 @@ import javax.annotation.PostConstruct; | @@ -57,6 +61,9 @@ import javax.annotation.PostConstruct; | ||
57 | import javax.annotation.PreDestroy; | 61 | import javax.annotation.PreDestroy; |
58 | import java.util.Optional; | 62 | import java.util.Optional; |
59 | 63 | ||
64 | +import static org.thingsboard.server.gen.cluster.ClusterAPIProtos.MessageType.CLUSTER_NETWORK_SERVER_DATA_MESSAGE; | ||
65 | +import static org.thingsboard.server.gen.cluster.ClusterAPIProtos.MessageType.RPC_BROADCAST_MSG; | ||
66 | + | ||
60 | @Service | 67 | @Service |
61 | @Slf4j | 68 | @Slf4j |
62 | public class DefaultActorService implements ActorService { | 69 | public class DefaultActorService implements ActorService { |
@@ -127,7 +134,7 @@ public class DefaultActorService implements ActorService { | @@ -127,7 +134,7 @@ public class DefaultActorService implements ActorService { | ||
127 | } | 134 | } |
128 | 135 | ||
129 | @Override | 136 | @Override |
130 | - public void onMsg(ServiceToRuleEngineMsg msg) { | 137 | + public void onMsg(SendToClusterMsg msg) { |
131 | appActor.tell(msg, ActorRef.noSender()); | 138 | appActor.tell(msg, ActorRef.noSender()); |
132 | } | 139 | } |
133 | 140 | ||
@@ -149,53 +156,7 @@ public class DefaultActorService implements ActorService { | @@ -149,53 +156,7 @@ public class DefaultActorService implements ActorService { | ||
149 | appActor.tell(msg, ActorRef.noSender()); | 156 | appActor.tell(msg, ActorRef.noSender()); |
150 | } | 157 | } |
151 | 158 | ||
152 | - @Override | ||
153 | - public void onMsg(ToPluginActorMsg msg) { | ||
154 | - log.trace("Processing plugin rpc msg: {}", msg); | ||
155 | - appActor.tell(msg, ActorRef.noSender()); | ||
156 | - } | ||
157 | - | ||
158 | - @Override | ||
159 | - public void onMsg(DeviceToDeviceActorMsg msg) { | ||
160 | - log.trace("Processing device rpc msg: {}", msg); | ||
161 | - appActor.tell(msg, ActorRef.noSender()); | ||
162 | - } | ||
163 | - | ||
164 | - @Override | ||
165 | - public void onMsg(ToDeviceActorNotificationMsg msg) { | ||
166 | - log.trace("Processing notification rpc msg: {}", msg); | ||
167 | - appActor.tell(msg, ActorRef.noSender()); | ||
168 | - } | ||
169 | - | ||
170 | - @Override | ||
171 | - public void onMsg(ToDeviceSessionActorMsg msg) { | ||
172 | - log.trace("Processing session rpc msg: {}", msg); | ||
173 | - sessionManagerActor.tell(msg, ActorRef.noSender()); | ||
174 | - } | ||
175 | - | ||
176 | - @Override | ||
177 | - public void onMsg(ToAllNodesMsg msg) { | ||
178 | - log.trace("Processing broadcast rpc msg: {}", msg); | ||
179 | - appActor.tell(msg, ActorRef.noSender()); | ||
180 | - } | ||
181 | 159 | ||
182 | - @Override | ||
183 | - public void onMsg(RpcSessionCreateRequestMsg msg) { | ||
184 | - log.trace("Processing session create msg: {}", msg); | ||
185 | - rpcManagerActor.tell(msg, ActorRef.noSender()); | ||
186 | - } | ||
187 | - | ||
188 | - @Override | ||
189 | - public void onMsg(RpcSessionTellMsg msg) { | ||
190 | - log.trace("Processing session rpc msg: {}", msg); | ||
191 | - rpcManagerActor.tell(msg, ActorRef.noSender()); | ||
192 | - } | ||
193 | - | ||
194 | - @Override | ||
195 | - public void onMsg(RpcBroadcastMsg msg) { | ||
196 | - log.trace("Processing broadcast rpc msg: {}", msg); | ||
197 | - rpcManagerActor.tell(msg, ActorRef.noSender()); | ||
198 | - } | ||
199 | 160 | ||
200 | @Override | 161 | @Override |
201 | public void onServerAdded(ServerInstance server) { | 162 | public void onServerAdded(ServerInstance server) { |
@@ -223,28 +184,29 @@ public class DefaultActorService implements ActorService { | @@ -223,28 +184,29 @@ public class DefaultActorService implements ActorService { | ||
223 | @Override | 184 | @Override |
224 | public void onCredentialsUpdate(TenantId tenantId, DeviceId deviceId) { | 185 | public void onCredentialsUpdate(TenantId tenantId, DeviceId deviceId) { |
225 | DeviceCredentialsUpdateNotificationMsg msg = new DeviceCredentialsUpdateNotificationMsg(tenantId, deviceId); | 186 | DeviceCredentialsUpdateNotificationMsg msg = new DeviceCredentialsUpdateNotificationMsg(tenantId, deviceId); |
226 | - Optional<ServerAddress> address = actorContext.getRoutingService().resolveById(deviceId); | ||
227 | - if (address.isPresent()) { | ||
228 | - rpcService.tell(address.get(), msg); | ||
229 | - } else { | ||
230 | - onMsg(msg); | ||
231 | - } | 187 | + appActor.tell(new SendToClusterMsg(deviceId, msg), ActorRef.noSender()); |
232 | } | 188 | } |
233 | 189 | ||
234 | @Override | 190 | @Override |
235 | public void onDeviceNameOrTypeUpdate(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType) { | 191 | public void onDeviceNameOrTypeUpdate(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType) { |
236 | log.trace("[{}] Processing onDeviceNameOrTypeUpdate event, deviceName: {}, deviceType: {}", deviceId, deviceName, deviceType); | 192 | log.trace("[{}] Processing onDeviceNameOrTypeUpdate event, deviceName: {}, deviceType: {}", deviceId, deviceName, deviceType); |
237 | DeviceNameOrTypeUpdateMsg msg = new DeviceNameOrTypeUpdateMsg(tenantId, deviceId, deviceName, deviceType); | 193 | DeviceNameOrTypeUpdateMsg msg = new DeviceNameOrTypeUpdateMsg(tenantId, deviceId, deviceName, deviceType); |
238 | - Optional<ServerAddress> address = actorContext.getRoutingService().resolveById(deviceId); | ||
239 | - if (address.isPresent()) { | ||
240 | - rpcService.tell(address.get(), msg); | ||
241 | - } else { | ||
242 | - onMsg(msg); | ||
243 | - } | 194 | + appActor.tell(new SendToClusterMsg(deviceId, msg), ActorRef.noSender()); |
195 | + } | ||
196 | + | ||
197 | + @Override | ||
198 | + public void onMsg(ServiceToRuleEngineMsg msg) { | ||
199 | + appActor.tell(msg, ActorRef.noSender()); | ||
244 | } | 200 | } |
245 | 201 | ||
246 | public void broadcast(ToAllNodesMsg msg) { | 202 | public void broadcast(ToAllNodesMsg msg) { |
247 | - rpcService.broadcast(msg); | 203 | + actorContext.getEncodingService().encode(msg); |
204 | + rpcService.broadcast(new RpcBroadcastMsg(ClusterAPIProtos.ClusterMessage | ||
205 | + .newBuilder() | ||
206 | + .setPayload(ByteString | ||
207 | + .copyFrom(actorContext.getEncodingService().encode(msg))) | ||
208 | + .setMessageType(CLUSTER_NETWORK_SERVER_DATA_MESSAGE) | ||
209 | + .build())); | ||
248 | appActor.tell(msg, ActorRef.noSender()); | 210 | appActor.tell(msg, ActorRef.noSender()); |
249 | } | 211 | } |
250 | 212 | ||
@@ -253,4 +215,37 @@ public class DefaultActorService implements ActorService { | @@ -253,4 +215,37 @@ public class DefaultActorService implements ActorService { | ||
253 | this.sessionManagerActor.tell(msg, ActorRef.noSender()); | 215 | this.sessionManagerActor.tell(msg, ActorRef.noSender()); |
254 | this.rpcManagerActor.tell(msg, ActorRef.noSender()); | 216 | this.rpcManagerActor.tell(msg, ActorRef.noSender()); |
255 | } | 217 | } |
218 | + | ||
219 | + @Override | ||
220 | + public void onRecievedMsg(ClusterAPIProtos.ClusterMessage msg) { | ||
221 | + switch(msg.getMessageType()) { | ||
222 | + case CLUSTER_NETWORK_SERVER_DATA_MESSAGE: | ||
223 | + java.util.Optional<TbActorMsg> decodedMsg = actorContext.getEncodingService() | ||
224 | + .decode(msg.getPayload().toByteArray()); | ||
225 | + if (decodedMsg.isPresent()) { | ||
226 | + appActor.tell(decodedMsg.get(), ActorRef.noSender()); | ||
227 | + } else { | ||
228 | + log.error("Error during decoding cluster proto message"); | ||
229 | + } | ||
230 | + break; | ||
231 | + case TO_ALL_NODES_MSG: | ||
232 | + //ToDo | ||
233 | + break; | ||
234 | + } | ||
235 | + } | ||
236 | + | ||
237 | + @Override | ||
238 | + public void onSendMsg(ClusterAPIProtos.ClusterMessage msg) { | ||
239 | + rpcManagerActor.tell(msg, ActorRef.noSender()); | ||
240 | + } | ||
241 | + | ||
242 | + @Override | ||
243 | + public void onRpcSessionCreateRequestMsg(RpcSessionCreateRequestMsg msg) { | ||
244 | + rpcManagerActor.tell(msg, ActorRef.noSender()); | ||
245 | + } | ||
246 | + | ||
247 | + @Override | ||
248 | + public void onBroadcastMsg(RpcBroadcastMsg msg) { | ||
249 | + rpcManagerActor.tell(msg, ActorRef.noSender()); | ||
250 | + } | ||
256 | } | 251 | } |
@@ -21,6 +21,7 @@ import org.thingsboard.server.actors.shared.SessionTimeoutMsg; | @@ -21,6 +21,7 @@ import org.thingsboard.server.actors.shared.SessionTimeoutMsg; | ||
21 | import org.thingsboard.server.common.data.id.DeviceId; | 21 | import org.thingsboard.server.common.data.id.DeviceId; |
22 | import org.thingsboard.server.common.data.id.SessionId; | 22 | import org.thingsboard.server.common.data.id.SessionId; |
23 | import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; | 23 | import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; |
24 | +import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | ||
24 | import org.thingsboard.server.common.msg.cluster.ServerAddress; | 25 | import org.thingsboard.server.common.msg.cluster.ServerAddress; |
25 | import org.thingsboard.server.common.msg.device.BasicDeviceToDeviceActorMsg; | 26 | import org.thingsboard.server.common.msg.device.BasicDeviceToDeviceActorMsg; |
26 | import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg; | 27 | import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg; |
@@ -87,22 +88,19 @@ abstract class AbstractSessionActorMsgProcessor extends AbstractContextAwareMsgP | @@ -87,22 +88,19 @@ abstract class AbstractSessionActorMsgProcessor extends AbstractContextAwareMsgP | ||
87 | } | 88 | } |
88 | 89 | ||
89 | protected Optional<ServerAddress> forwardToAppActorIfAdressChanged(ActorContext ctx, DeviceToDeviceActorMsg toForward, Optional<ServerAddress> oldAddress) { | 90 | protected Optional<ServerAddress> forwardToAppActorIfAdressChanged(ActorContext ctx, DeviceToDeviceActorMsg toForward, Optional<ServerAddress> oldAddress) { |
91 | + | ||
90 | Optional<ServerAddress> newAddress = systemContext.getRoutingService().resolveById(toForward.getDeviceId()); | 92 | Optional<ServerAddress> newAddress = systemContext.getRoutingService().resolveById(toForward.getDeviceId()); |
91 | if (!newAddress.equals(oldAddress)) { | 93 | if (!newAddress.equals(oldAddress)) { |
92 | - if (newAddress.isPresent()) { | ||
93 | - systemContext.getRpcService().tell(newAddress.get(), | ||
94 | - toForward.toOtherAddress(systemContext.getRoutingService().getCurrentServer())); | ||
95 | - } else { | ||
96 | - getAppActor().tell(toForward, ctx.self()); | ||
97 | - } | 94 | + getAppActor().tell(new SendToClusterMsg(toForward.getDeviceId(), toForward |
95 | + .toOtherAddress(systemContext.getRoutingService().getCurrentServer())), ctx.self()); | ||
98 | } | 96 | } |
99 | return newAddress; | 97 | return newAddress; |
100 | } | 98 | } |
101 | 99 | ||
102 | protected void forwardToAppActor(ActorContext ctx, DeviceToDeviceActorMsg toForward, Optional<ServerAddress> address) { | 100 | protected void forwardToAppActor(ActorContext ctx, DeviceToDeviceActorMsg toForward, Optional<ServerAddress> address) { |
103 | if (address.isPresent()) { | 101 | if (address.isPresent()) { |
104 | - systemContext.getRpcService().tell(address.get(), | ||
105 | - toForward.toOtherAddress(systemContext.getRoutingService().getCurrentServer())); | 102 | + systemContext.getRpcService().tell(systemContext.getEncodingService().convertToProtoDataMessage(address.get(), |
103 | + toForward.toOtherAddress(systemContext.getRoutingService().getCurrentServer()))); | ||
106 | } else { | 104 | } else { |
107 | getAppActor().tell(toForward, ctx.self()); | 105 | getAppActor().tell(toForward, ctx.self()); |
108 | } | 106 | } |
@@ -20,7 +20,7 @@ import lombok.EqualsAndHashCode; | @@ -20,7 +20,7 @@ import lombok.EqualsAndHashCode; | ||
20 | import lombok.Getter; | 20 | import lombok.Getter; |
21 | import lombok.ToString; | 21 | import lombok.ToString; |
22 | import org.thingsboard.server.common.msg.cluster.ServerAddress; | 22 | import org.thingsboard.server.common.msg.cluster.ServerAddress; |
23 | -import org.thingsboard.server.gen.discovery.ServerInstanceProtos.ServerInfo; | 23 | +import org.thingsboard.server.gen.discovery.ServerInstanceProtos; |
24 | 24 | ||
25 | /** | 25 | /** |
26 | * @author Andrew Shvayka | 26 | * @author Andrew Shvayka |
@@ -29,8 +29,6 @@ import org.thingsboard.server.gen.discovery.ServerInstanceProtos.ServerInfo; | @@ -29,8 +29,6 @@ import org.thingsboard.server.gen.discovery.ServerInstanceProtos.ServerInfo; | ||
29 | @EqualsAndHashCode(exclude = {"serverInfo", "serverAddress"}) | 29 | @EqualsAndHashCode(exclude = {"serverInfo", "serverAddress"}) |
30 | public final class ServerInstance implements Comparable<ServerInstance> { | 30 | public final class ServerInstance implements Comparable<ServerInstance> { |
31 | 31 | ||
32 | - @Getter(AccessLevel.PACKAGE) | ||
33 | - private final ServerInfo serverInfo; | ||
34 | @Getter | 32 | @Getter |
35 | private final String host; | 33 | private final String host; |
36 | @Getter | 34 | @Getter |
@@ -38,8 +36,13 @@ public final class ServerInstance implements Comparable<ServerInstance> { | @@ -38,8 +36,13 @@ public final class ServerInstance implements Comparable<ServerInstance> { | ||
38 | @Getter | 36 | @Getter |
39 | private final ServerAddress serverAddress; | 37 | private final ServerAddress serverAddress; |
40 | 38 | ||
41 | - public ServerInstance(ServerInfo serverInfo) { | ||
42 | - this.serverInfo = serverInfo; | 39 | + public ServerInstance(ServerAddress serverAddress) { |
40 | + this.serverAddress = serverAddress; | ||
41 | + this.host = serverAddress.getHost(); | ||
42 | + this.port = serverAddress.getPort(); | ||
43 | + } | ||
44 | + | ||
45 | + public ServerInstance(ServerInstanceProtos.ServerInfo serverInfo) { | ||
43 | this.host = serverInfo.getHost(); | 46 | this.host = serverInfo.getHost(); |
44 | this.port = serverInfo.getPort(); | 47 | this.port = serverInfo.getPort(); |
45 | this.serverAddress = new ServerAddress(host, port); | 48 | this.serverAddress = new ServerAddress(host, port); |
@@ -15,8 +15,9 @@ | @@ -15,8 +15,9 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.cluster.discovery; | 16 | package org.thingsboard.server.service.cluster.discovery; |
17 | 17 | ||
18 | -import com.google.protobuf.InvalidProtocolBufferException; | ||
19 | import lombok.extern.slf4j.Slf4j; | 18 | import lombok.extern.slf4j.Slf4j; |
19 | +import org.apache.commons.lang3.SerializationException; | ||
20 | +import org.apache.commons.lang3.SerializationUtils; | ||
20 | import org.apache.curator.framework.CuratorFramework; | 21 | import org.apache.curator.framework.CuratorFramework; |
21 | import org.apache.curator.framework.CuratorFrameworkFactory; | 22 | import org.apache.curator.framework.CuratorFrameworkFactory; |
22 | import org.apache.curator.framework.recipes.cache.ChildData; | 23 | import org.apache.curator.framework.recipes.cache.ChildData; |
@@ -33,13 +34,13 @@ import org.springframework.boot.context.event.ApplicationReadyEvent; | @@ -33,13 +34,13 @@ import org.springframework.boot.context.event.ApplicationReadyEvent; | ||
33 | import org.springframework.context.ApplicationListener; | 34 | import org.springframework.context.ApplicationListener; |
34 | import org.springframework.stereotype.Service; | 35 | import org.springframework.stereotype.Service; |
35 | import org.springframework.util.Assert; | 36 | import org.springframework.util.Assert; |
36 | -import org.thingsboard.server.gen.discovery.ServerInstanceProtos.ServerInfo; | 37 | +import org.thingsboard.server.common.msg.cluster.ServerAddress; |
37 | import org.thingsboard.server.utils.MiscUtils; | 38 | import org.thingsboard.server.utils.MiscUtils; |
38 | 39 | ||
39 | import javax.annotation.PostConstruct; | 40 | import javax.annotation.PostConstruct; |
40 | import javax.annotation.PreDestroy; | 41 | import javax.annotation.PreDestroy; |
41 | -import java.io.IOException; | ||
42 | import java.util.List; | 42 | import java.util.List; |
43 | +import java.util.NoSuchElementException; | ||
43 | import java.util.concurrent.CopyOnWriteArrayList; | 44 | import java.util.concurrent.CopyOnWriteArrayList; |
44 | import java.util.stream.Collectors; | 45 | import java.util.stream.Collectors; |
45 | 46 | ||
@@ -113,7 +114,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi | @@ -113,7 +114,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi | ||
113 | log.info("[{}:{}] Creating ZK node for current instance", self.getHost(), self.getPort()); | 114 | log.info("[{}:{}] Creating ZK node for current instance", self.getHost(), self.getPort()); |
114 | nodePath = client.create() | 115 | nodePath = client.create() |
115 | .creatingParentsIfNeeded() | 116 | .creatingParentsIfNeeded() |
116 | - .withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(zkNodesDir + "/", self.getServerInfo().toByteArray()); | 117 | + .withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(zkNodesDir + "/", SerializationUtils.serialize(self.getServerAddress())); |
117 | log.info("[{}:{}] Created ZK node for current instance: {}", self.getHost(), self.getPort(), nodePath); | 118 | log.info("[{}:{}] Created ZK node for current instance: {}", self.getHost(), self.getPort(), nodePath); |
118 | } catch (Exception e) { | 119 | } catch (Exception e) { |
119 | log.error("Failed to create ZK node", e); | 120 | log.error("Failed to create ZK node", e); |
@@ -144,8 +145,8 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi | @@ -144,8 +145,8 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi | ||
144 | .filter(cd -> !cd.getPath().equals(nodePath)) | 145 | .filter(cd -> !cd.getPath().equals(nodePath)) |
145 | .map(cd -> { | 146 | .map(cd -> { |
146 | try { | 147 | try { |
147 | - return new ServerInstance(ServerInfo.parseFrom(cd.getData())); | ||
148 | - } catch (InvalidProtocolBufferException e) { | 148 | + return new ServerInstance( (ServerAddress) SerializationUtils.deserialize(cd.getData())); |
149 | + } catch (NoSuchElementException e) { | ||
149 | log.error("Failed to decode ZK node", e); | 150 | log.error("Failed to decode ZK node", e); |
150 | throw new RuntimeException(e); | 151 | throw new RuntimeException(e); |
151 | } | 152 | } |
@@ -186,8 +187,9 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi | @@ -186,8 +187,9 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi | ||
186 | } | 187 | } |
187 | ServerInstance instance; | 188 | ServerInstance instance; |
188 | try { | 189 | try { |
189 | - instance = new ServerInstance(ServerInfo.parseFrom(data.getData())); | ||
190 | - } catch (IOException e) { | 190 | + ServerAddress serverAddress = SerializationUtils.deserialize(data.getData()); |
191 | + instance = new ServerInstance(serverAddress); | ||
192 | + } catch (SerializationException e) { | ||
191 | log.error("Failed to decode server instance for node {}", data.getPath(), e); | 193 | log.error("Failed to decode server instance for node {}", data.getPath(), e); |
192 | throw e; | 194 | throw e; |
193 | } | 195 | } |
@@ -25,26 +25,20 @@ import org.springframework.stereotype.Service; | @@ -25,26 +25,20 @@ import org.springframework.stereotype.Service; | ||
25 | import org.springframework.util.SerializationUtils; | 25 | import org.springframework.util.SerializationUtils; |
26 | import org.thingsboard.server.actors.rpc.RpcBroadcastMsg; | 26 | import org.thingsboard.server.actors.rpc.RpcBroadcastMsg; |
27 | import org.thingsboard.server.actors.rpc.RpcSessionCreateRequestMsg; | 27 | import org.thingsboard.server.actors.rpc.RpcSessionCreateRequestMsg; |
28 | -import org.thingsboard.server.actors.rpc.RpcSessionTellMsg; | ||
29 | import org.thingsboard.server.common.data.id.EntityId; | 28 | import org.thingsboard.server.common.data.id.EntityId; |
30 | -import org.thingsboard.server.common.msg.cluster.ServerAddress; | ||
31 | -import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; | ||
32 | import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; | 29 | import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; |
33 | -import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg; | ||
34 | -import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg; | ||
35 | -import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse; | ||
36 | -import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; | ||
37 | -import org.thingsboard.server.extensions.api.plugins.msg.ToPluginRpcResponseDeviceMsg; | ||
38 | -import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg; | 30 | + |
39 | import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | 31 | import org.thingsboard.server.gen.cluster.ClusterAPIProtos; |
32 | + | ||
40 | import org.thingsboard.server.gen.cluster.ClusterRpcServiceGrpc; | 33 | import org.thingsboard.server.gen.cluster.ClusterRpcServiceGrpc; |
41 | import org.thingsboard.server.service.cluster.discovery.ServerInstance; | 34 | import org.thingsboard.server.service.cluster.discovery.ServerInstance; |
42 | import org.thingsboard.server.service.cluster.discovery.ServerInstanceService; | 35 | import org.thingsboard.server.service.cluster.discovery.ServerInstanceService; |
43 | -import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; | ||
44 | 36 | ||
45 | import javax.annotation.PreDestroy; | 37 | import javax.annotation.PreDestroy; |
46 | import java.io.IOException; | 38 | import java.io.IOException; |
47 | import java.util.UUID; | 39 | import java.util.UUID; |
40 | +import java.util.concurrent.ArrayBlockingQueue; | ||
41 | +import java.util.concurrent.BlockingQueue; | ||
48 | import java.util.concurrent.ConcurrentHashMap; | 42 | import java.util.concurrent.ConcurrentHashMap; |
49 | import java.util.concurrent.ConcurrentMap; | 43 | import java.util.concurrent.ConcurrentMap; |
50 | 44 | ||
@@ -64,7 +58,8 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | @@ -64,7 +58,8 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | ||
64 | 58 | ||
65 | private ServerInstance instance; | 59 | private ServerInstance instance; |
66 | 60 | ||
67 | - private ConcurrentMap<UUID, RpcSessionCreationFuture> pendingSessionMap = new ConcurrentHashMap<>(); | 61 | + private ConcurrentMap<UUID, BlockingQueue<StreamObserver<ClusterAPIProtos.ClusterMessage>>> pendingSessionMap = |
62 | + new ConcurrentHashMap<>(); | ||
68 | 63 | ||
69 | public void init(RpcMsgListener listener) { | 64 | public void init(RpcMsgListener listener) { |
70 | this.listener = listener; | 65 | this.listener = listener; |
@@ -82,11 +77,11 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | @@ -82,11 +77,11 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | ||
82 | } | 77 | } |
83 | 78 | ||
84 | @Override | 79 | @Override |
85 | - public void onSessionCreated(UUID msgUid, StreamObserver<ClusterAPIProtos.ToRpcServerMessage> msg) { | ||
86 | - RpcSessionCreationFuture future = pendingSessionMap.remove(msgUid); | ||
87 | - if (future != null) { | 80 | + public void onSessionCreated(UUID msgUid, StreamObserver<ClusterAPIProtos.ClusterMessage> inputStream) { |
81 | + BlockingQueue<StreamObserver<ClusterAPIProtos.ClusterMessage>> queue = pendingSessionMap.remove(msgUid); | ||
82 | + if (queue != null) { | ||
88 | try { | 83 | try { |
89 | - future.onMsg(msg); | 84 | + queue.put(inputStream); |
90 | } catch (InterruptedException e) { | 85 | } catch (InterruptedException e) { |
91 | log.warn("Failed to report created session!"); | 86 | log.warn("Failed to report created session!"); |
92 | Thread.currentThread().interrupt(); | 87 | Thread.currentThread().interrupt(); |
@@ -97,11 +92,13 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | @@ -97,11 +92,13 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | ||
97 | } | 92 | } |
98 | 93 | ||
99 | @Override | 94 | @Override |
100 | - public StreamObserver<ClusterAPIProtos.ToRpcServerMessage> handlePluginMsgs(StreamObserver<ClusterAPIProtos.ToRpcServerMessage> responseObserver) { | 95 | + public StreamObserver<ClusterAPIProtos.ClusterMessage> handleMsgs( |
96 | + StreamObserver<ClusterAPIProtos.ClusterMessage> responseObserver) { | ||
101 | log.info("Processing new session."); | 97 | log.info("Processing new session."); |
102 | return createSession(new RpcSessionCreateRequestMsg(UUID.randomUUID(), null, responseObserver)); | 98 | return createSession(new RpcSessionCreateRequestMsg(UUID.randomUUID(), null, responseObserver)); |
103 | } | 99 | } |
104 | 100 | ||
101 | + | ||
105 | @PreDestroy | 102 | @PreDestroy |
106 | public void stop() { | 103 | public void stop() { |
107 | if (server != null) { | 104 | if (server != null) { |
@@ -117,65 +114,18 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | @@ -117,65 +114,18 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | ||
117 | } | 114 | } |
118 | } | 115 | } |
119 | 116 | ||
120 | - @Override | ||
121 | - public void tell(ServerAddress serverAddress, DeviceToDeviceActorMsg toForward) { | ||
122 | - ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder() | ||
123 | - .setToDeviceActorRpcMsg(toProtoMsg(toForward)).build(); | ||
124 | - tell(serverAddress, msg); | ||
125 | - } | ||
126 | - | ||
127 | - @Override | ||
128 | - public void tell(ServerAddress serverAddress, ToDeviceActorNotificationMsg toForward) { | ||
129 | - ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder() | ||
130 | - .setToDeviceActorNotificationRpcMsg(toProtoMsg(toForward)).build(); | ||
131 | - tell(serverAddress, msg); | ||
132 | - } | ||
133 | - | ||
134 | - @Override | ||
135 | - public void tell(ServerAddress serverAddress, ToDeviceRpcRequestActorMsg toForward) { | ||
136 | - ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder() | ||
137 | - .setToDeviceRpcRequestRpcMsg(toProtoMsg(toForward)).build(); | ||
138 | - tell(serverAddress, msg); | ||
139 | - } | ||
140 | - | ||
141 | - @Override | ||
142 | - public void tell(ServerAddress serverAddress, ToPluginRpcResponseDeviceMsg toForward) { | ||
143 | - ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder() | ||
144 | - .setToPluginRpcResponseRpcMsg(toProtoMsg(toForward)).build(); | ||
145 | - tell(serverAddress, msg); | ||
146 | - } | ||
147 | - | ||
148 | - @Override | ||
149 | - public void tell(ServerAddress serverAddress, ToDeviceSessionActorMsg toForward) { | ||
150 | - ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder() | ||
151 | - .setToDeviceSessionActorRpcMsg(toProtoMsg(toForward)).build(); | ||
152 | - tell(serverAddress, msg); | ||
153 | - } | ||
154 | 117 | ||
155 | @Override | 118 | @Override |
156 | - public void tell(PluginRpcMsg toForward) { | ||
157 | - ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder() | ||
158 | - .setToPluginRpcMsg(toProtoMsg(toForward)).build(); | ||
159 | - tell(toForward.getRpcMsg().getServerAddress(), msg); | ||
160 | - } | ||
161 | - | ||
162 | - @Override | ||
163 | - public void broadcast(ToAllNodesMsg toForward) { | ||
164 | - ClusterAPIProtos.ToRpcServerMessage msg = ClusterAPIProtos.ToRpcServerMessage.newBuilder() | ||
165 | - .setToAllNodesRpcMsg(toProtoMsg(toForward)).build(); | ||
166 | - listener.onMsg(new RpcBroadcastMsg(msg)); | ||
167 | - } | ||
168 | - | ||
169 | - private void tell(ServerAddress serverAddress, ClusterAPIProtos.ToRpcServerMessage msg) { | ||
170 | - listener.onMsg(new RpcSessionTellMsg(serverAddress, msg)); | 119 | + public void broadcast(RpcBroadcastMsg msg) { |
120 | + listener.onBroadcastMsg(msg); | ||
171 | } | 121 | } |
172 | 122 | ||
173 | - private StreamObserver<ClusterAPIProtos.ToRpcServerMessage> createSession(RpcSessionCreateRequestMsg msg) { | ||
174 | - RpcSessionCreationFuture future = new RpcSessionCreationFuture(); | ||
175 | - pendingSessionMap.put(msg.getMsgUid(), future); | ||
176 | - listener.onMsg(msg); | 123 | + private StreamObserver<ClusterAPIProtos.ClusterMessage> createSession(RpcSessionCreateRequestMsg msg) { |
124 | + BlockingQueue<StreamObserver<ClusterAPIProtos.ClusterMessage>> queue = new ArrayBlockingQueue<>(1); | ||
125 | + pendingSessionMap.put(msg.getMsgUid(), queue); | ||
126 | + listener.onRpcSessionCreateRequestMsg(msg); | ||
177 | try { | 127 | try { |
178 | - StreamObserver<ClusterAPIProtos.ToRpcServerMessage> observer = future.get(); | 128 | + StreamObserver<ClusterAPIProtos.ClusterMessage> observer = queue.take(); |
179 | log.info("Processed new session."); | 129 | log.info("Processed new session."); |
180 | return observer; | 130 | return observer; |
181 | } catch (Exception e) { | 131 | } catch (Exception e) { |
@@ -184,76 +134,10 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | @@ -184,76 +134,10 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI | ||
184 | } | 134 | } |
185 | } | 135 | } |
186 | 136 | ||
187 | - private static ClusterAPIProtos.ToDeviceActorRpcMessage toProtoMsg(DeviceToDeviceActorMsg msg) { | ||
188 | - return ClusterAPIProtos.ToDeviceActorRpcMessage.newBuilder().setData( | ||
189 | - ByteString.copyFrom(SerializationUtils.serialize(msg)) | ||
190 | - ).build(); | ||
191 | - } | ||
192 | - | ||
193 | - private static ClusterAPIProtos.ToDeviceActorNotificationRpcMessage toProtoMsg(ToDeviceActorNotificationMsg msg) { | ||
194 | - return ClusterAPIProtos.ToDeviceActorNotificationRpcMessage.newBuilder().setData( | ||
195 | - ByteString.copyFrom(SerializationUtils.serialize(msg)) | ||
196 | - ).build(); | ||
197 | - } | ||
198 | - | ||
199 | - private static ClusterAPIProtos.ToDeviceRpcRequestRpcMessage toProtoMsg(ToDeviceRpcRequestActorMsg msg) { | ||
200 | - ClusterAPIProtos.ToDeviceRpcRequestRpcMessage.Builder builder = ClusterAPIProtos.ToDeviceRpcRequestRpcMessage.newBuilder(); | ||
201 | - ToDeviceRpcRequest request = msg.getMsg(); | ||
202 | - | ||
203 | - builder.setDeviceTenantId(toUid(msg.getTenantId())); | ||
204 | - builder.setDeviceId(toUid(msg.getDeviceId())); | ||
205 | - | ||
206 | - builder.setMsgId(toUid(request.getId())); | ||
207 | - builder.setOneway(request.isOneway()); | ||
208 | - builder.setExpTime(request.getExpirationTime()); | ||
209 | - builder.setMethod(request.getBody().getMethod()); | ||
210 | - builder.setParams(request.getBody().getParams()); | ||
211 | - | ||
212 | - return builder.build(); | ||
213 | - } | ||
214 | - | ||
215 | - private static ClusterAPIProtos.ToPluginRpcResponseRpcMessage toProtoMsg(ToPluginRpcResponseDeviceMsg msg) { | ||
216 | - ClusterAPIProtos.ToPluginRpcResponseRpcMessage.Builder builder = ClusterAPIProtos.ToPluginRpcResponseRpcMessage.newBuilder(); | ||
217 | - FromDeviceRpcResponse request = msg.getResponse(); | ||
218 | - | ||
219 | - builder.setMsgId(toUid(request.getId())); | ||
220 | - request.getResponse().ifPresent(builder::setResponse); | ||
221 | - request.getError().ifPresent(e -> builder.setError(e.name())); | ||
222 | - | ||
223 | - return builder.build(); | ||
224 | - } | ||
225 | - | ||
226 | - private ClusterAPIProtos.ToAllNodesRpcMessage toProtoMsg(ToAllNodesMsg msg) { | ||
227 | - return ClusterAPIProtos.ToAllNodesRpcMessage.newBuilder().setData( | ||
228 | - ByteString.copyFrom(SerializationUtils.serialize(msg)) | ||
229 | - ).build(); | ||
230 | - } | ||
231 | - | ||
232 | - | ||
233 | - private ClusterAPIProtos.ToPluginRpcMessage toProtoMsg(PluginRpcMsg msg) { | ||
234 | - return ClusterAPIProtos.ToPluginRpcMessage.newBuilder() | ||
235 | - .setClazz(msg.getRpcMsg().getMsgClazz()) | ||
236 | - .setData(ByteString.copyFrom(msg.getRpcMsg().getMsgData())) | ||
237 | - .setAddress(ClusterAPIProtos.PluginAddress.newBuilder() | ||
238 | - .setTenantId(toUid(msg.getPluginTenantId().getId())) | ||
239 | - .setPluginId(toUid(msg.getPluginId().getId())) | ||
240 | - .build() | ||
241 | - ).build(); | ||
242 | - } | ||
243 | - | ||
244 | - private static ClusterAPIProtos.Uid toUid(EntityId uuid) { | ||
245 | - return toUid(uuid.getId()); | ||
246 | - } | ||
247 | - | ||
248 | - private static ClusterAPIProtos.Uid toUid(UUID uuid) { | ||
249 | - return ClusterAPIProtos.Uid.newBuilder().setPluginUuidMsb(uuid.getMostSignificantBits()).setPluginUuidLsb( | ||
250 | - uuid.getLeastSignificantBits()).build(); | 137 | + @Override |
138 | + public void tell(ClusterAPIProtos.ClusterMessage message) { | ||
139 | + listener.onSendMsg(message); | ||
251 | } | 140 | } |
252 | 141 | ||
253 | - private static ClusterAPIProtos.ToDeviceSessionActorRpcMessage toProtoMsg(ToDeviceSessionActorMsg msg) { | ||
254 | - return ClusterAPIProtos.ToDeviceSessionActorRpcMessage.newBuilder().setData( | ||
255 | - ByteString.copyFrom(SerializationUtils.serialize(msg)) | ||
256 | - ).build(); | ||
257 | - } | ||
258 | 142 | ||
259 | } | 143 | } |
@@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
16 | package org.thingsboard.server.service.cluster.rpc; | 16 | package org.thingsboard.server.service.cluster.rpc; |
17 | 17 | ||
18 | import io.grpc.stub.StreamObserver; | 18 | import io.grpc.stub.StreamObserver; |
19 | +import org.thingsboard.server.actors.rpc.RpcBroadcastMsg; | ||
19 | import org.thingsboard.server.common.msg.cluster.ServerAddress; | 20 | import org.thingsboard.server.common.msg.cluster.ServerAddress; |
20 | import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; | 21 | import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; |
21 | import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; | 22 | import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; |
@@ -35,20 +36,10 @@ public interface ClusterRpcService { | @@ -35,20 +36,10 @@ public interface ClusterRpcService { | ||
35 | 36 | ||
36 | void init(RpcMsgListener listener); | 37 | void init(RpcMsgListener listener); |
37 | 38 | ||
38 | - void tell(ServerAddress serverAddress, DeviceToDeviceActorMsg toForward); | 39 | + void broadcast(RpcBroadcastMsg msg); |
39 | 40 | ||
40 | - void tell(ServerAddress serverAddress, ToDeviceSessionActorMsg toForward); | 41 | + void onSessionCreated(UUID msgUid, StreamObserver<ClusterAPIProtos.ClusterMessage> inputStream); |
41 | 42 | ||
42 | - void tell(ServerAddress serverAddress, ToDeviceActorNotificationMsg toForward); | ||
43 | - | ||
44 | - void tell(ServerAddress serverAddress, ToDeviceRpcRequestActorMsg toForward); | ||
45 | - | ||
46 | - void tell(ServerAddress serverAddress, ToPluginRpcResponseDeviceMsg toForward); | ||
47 | - | ||
48 | - void tell(PluginRpcMsg toForward); | ||
49 | - | ||
50 | - void broadcast(ToAllNodesMsg msg); | ||
51 | - | ||
52 | - void onSessionCreated(UUID msgUid, StreamObserver<ClusterAPIProtos.ToRpcServerMessage> inputStream); | 43 | + void tell(ClusterAPIProtos.ClusterMessage message); |
53 | 44 | ||
54 | } | 45 | } |
@@ -33,8 +33,8 @@ public final class GrpcSession implements Closeable { | @@ -33,8 +33,8 @@ public final class GrpcSession implements Closeable { | ||
33 | private final UUID sessionId; | 33 | private final UUID sessionId; |
34 | private final boolean client; | 34 | private final boolean client; |
35 | private final GrpcSessionListener listener; | 35 | private final GrpcSessionListener listener; |
36 | - private StreamObserver<ClusterAPIProtos.ToRpcServerMessage> inputStream; | ||
37 | - private StreamObserver<ClusterAPIProtos.ToRpcServerMessage> outputStream; | 36 | + private StreamObserver<ClusterAPIProtos.ClusterMessage> inputStream; |
37 | + private StreamObserver<ClusterAPIProtos.ClusterMessage> outputStream; | ||
38 | 38 | ||
39 | private boolean connected; | 39 | private boolean connected; |
40 | private ServerAddress remoteServer; | 40 | private ServerAddress remoteServer; |
@@ -56,17 +56,17 @@ public final class GrpcSession implements Closeable { | @@ -56,17 +56,17 @@ public final class GrpcSession implements Closeable { | ||
56 | } | 56 | } |
57 | 57 | ||
58 | public void initInputStream() { | 58 | public void initInputStream() { |
59 | - this.inputStream = new StreamObserver<ClusterAPIProtos.ToRpcServerMessage>() { | 59 | + this.inputStream = new StreamObserver<ClusterAPIProtos.ClusterMessage>() { |
60 | @Override | 60 | @Override |
61 | - public void onNext(ClusterAPIProtos.ToRpcServerMessage msg) { | ||
62 | - if (!connected && msg.hasConnectMsg()) { | 61 | + public void onNext(ClusterAPIProtos.ClusterMessage clusterMessage) { |
62 | + if (!connected && clusterMessage.getMessageType() == ClusterAPIProtos.MessageType.CONNECT_RPC_MESSAGE) { | ||
63 | connected = true; | 63 | connected = true; |
64 | - ClusterAPIProtos.ServerAddress rpcAddress = msg.getConnectMsg().getServerAddress(); | 64 | + ServerAddress rpcAddress = new ServerAddress(clusterMessage.getServerAdresss().getHost(), clusterMessage.getServerAdresss().getPort()); |
65 | remoteServer = new ServerAddress(rpcAddress.getHost(), rpcAddress.getPort()); | 65 | remoteServer = new ServerAddress(rpcAddress.getHost(), rpcAddress.getPort()); |
66 | listener.onConnected(GrpcSession.this); | 66 | listener.onConnected(GrpcSession.this); |
67 | } | 67 | } |
68 | if (connected) { | 68 | if (connected) { |
69 | - handleToRpcServerMessage(msg); | 69 | + listener.onReceiveClusterGrpcMsg(GrpcSession.this, clusterMessage); |
70 | } | 70 | } |
71 | } | 71 | } |
72 | 72 | ||
@@ -83,37 +83,13 @@ public final class GrpcSession implements Closeable { | @@ -83,37 +83,13 @@ public final class GrpcSession implements Closeable { | ||
83 | }; | 83 | }; |
84 | } | 84 | } |
85 | 85 | ||
86 | - private void handleToRpcServerMessage(ClusterAPIProtos.ToRpcServerMessage msg) { | ||
87 | - if (msg.hasToPluginRpcMsg()) { | ||
88 | - listener.onToPluginRpcMsg(GrpcSession.this, msg.getToPluginRpcMsg()); | ||
89 | - } | ||
90 | - if (msg.hasToDeviceActorRpcMsg()) { | ||
91 | - listener.onToDeviceActorRpcMsg(GrpcSession.this, msg.getToDeviceActorRpcMsg()); | ||
92 | - } | ||
93 | - if (msg.hasToDeviceSessionActorRpcMsg()) { | ||
94 | - listener.onToDeviceSessionActorRpcMsg(GrpcSession.this, msg.getToDeviceSessionActorRpcMsg()); | ||
95 | - } | ||
96 | - if (msg.hasToDeviceActorNotificationRpcMsg()) { | ||
97 | - listener.onToDeviceActorNotificationRpcMsg(GrpcSession.this, msg.getToDeviceActorNotificationRpcMsg()); | ||
98 | - } | ||
99 | - if (msg.hasToDeviceRpcRequestRpcMsg()) { | ||
100 | - listener.onToDeviceRpcRequestRpcMsg(GrpcSession.this, msg.getToDeviceRpcRequestRpcMsg()); | ||
101 | - } | ||
102 | - if (msg.hasToPluginRpcResponseRpcMsg()) { | ||
103 | - listener.onFromDeviceRpcResponseRpcMsg(GrpcSession.this, msg.getToPluginRpcResponseRpcMsg()); | ||
104 | - } | ||
105 | - if (msg.hasToAllNodesRpcMsg()) { | ||
106 | - listener.onToAllNodesRpcMessage(GrpcSession.this, msg.getToAllNodesRpcMsg()); | ||
107 | - } | ||
108 | - } | ||
109 | - | ||
110 | public void initOutputStream() { | 86 | public void initOutputStream() { |
111 | if (client) { | 87 | if (client) { |
112 | listener.onConnected(GrpcSession.this); | 88 | listener.onConnected(GrpcSession.this); |
113 | } | 89 | } |
114 | } | 90 | } |
115 | 91 | ||
116 | - public void sendMsg(ClusterAPIProtos.ToRpcServerMessage msg) { | 92 | + public void sendMsg(ClusterAPIProtos.ClusterMessage msg) { |
117 | outputStream.onNext(msg); | 93 | outputStream.onNext(msg); |
118 | } | 94 | } |
119 | 95 |
@@ -26,20 +26,7 @@ public interface GrpcSessionListener { | @@ -26,20 +26,7 @@ public interface GrpcSessionListener { | ||
26 | 26 | ||
27 | void onDisconnected(GrpcSession session); | 27 | void onDisconnected(GrpcSession session); |
28 | 28 | ||
29 | - void onToPluginRpcMsg(GrpcSession session, ClusterAPIProtos.ToPluginRpcMessage msg); | ||
30 | - | ||
31 | - void onToDeviceActorRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceActorRpcMessage msg); | ||
32 | - | ||
33 | - void onToDeviceActorNotificationRpcMsg(GrpcSession grpcSession, ClusterAPIProtos.ToDeviceActorNotificationRpcMessage msg); | ||
34 | - | ||
35 | - void onToDeviceSessionActorRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceSessionActorRpcMessage msg); | ||
36 | - | ||
37 | - void onToAllNodesRpcMessage(GrpcSession grpcSession, ClusterAPIProtos.ToAllNodesRpcMessage toAllNodesRpcMessage); | ||
38 | - | ||
39 | - void onToDeviceRpcRequestRpcMsg(GrpcSession grpcSession, ClusterAPIProtos.ToDeviceRpcRequestRpcMessage toDeviceRpcRequestRpcMsg); | ||
40 | - | ||
41 | - void onFromDeviceRpcResponseRpcMsg(GrpcSession grpcSession, ClusterAPIProtos.ToPluginRpcResponseRpcMessage toPluginRpcResponseRpcMsg); | 29 | + void onReceiveClusterGrpcMsg(GrpcSession session, ClusterAPIProtos.ClusterMessage clusterMessage); |
42 | 30 | ||
43 | void onError(GrpcSession session, Throwable t); | 31 | void onError(GrpcSession session, Throwable t); |
44 | - | ||
45 | } | 32 | } |
@@ -17,32 +17,15 @@ package org.thingsboard.server.service.cluster.rpc; | @@ -17,32 +17,15 @@ package org.thingsboard.server.service.cluster.rpc; | ||
17 | 17 | ||
18 | import org.thingsboard.server.actors.rpc.RpcBroadcastMsg; | 18 | import org.thingsboard.server.actors.rpc.RpcBroadcastMsg; |
19 | import org.thingsboard.server.actors.rpc.RpcSessionCreateRequestMsg; | 19 | import org.thingsboard.server.actors.rpc.RpcSessionCreateRequestMsg; |
20 | -import org.thingsboard.server.actors.rpc.RpcSessionTellMsg; | ||
21 | -import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; | ||
22 | -import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; | ||
23 | -import org.thingsboard.server.common.msg.device.DeviceToDeviceActorMsg; | ||
24 | -import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg; | ||
25 | -import org.thingsboard.server.extensions.api.plugins.msg.ToPluginActorMsg; | 20 | +import org.thingsboard.server.gen.cluster.ClusterAPIProtos; |
26 | 21 | ||
27 | /** | 22 | /** |
28 | * @author Andrew Shvayka | 23 | * @author Andrew Shvayka |
29 | */ | 24 | */ |
30 | -public interface RpcMsgListener { | ||
31 | - | ||
32 | - void onMsg(DeviceToDeviceActorMsg msg); | ||
33 | - | ||
34 | - void onMsg(ToDeviceActorNotificationMsg msg); | ||
35 | - | ||
36 | - void onMsg(ToDeviceSessionActorMsg msg); | ||
37 | - | ||
38 | - void onMsg(ToAllNodesMsg nodeMsg); | ||
39 | - | ||
40 | - void onMsg(ToPluginActorMsg msg); | ||
41 | - | ||
42 | - void onMsg(RpcSessionCreateRequestMsg msg); | ||
43 | - | ||
44 | - void onMsg(RpcSessionTellMsg rpcSessionTellMsg); | ||
45 | - | ||
46 | - void onMsg(RpcBroadcastMsg rpcBroadcastMsg); | ||
47 | 25 | ||
26 | +public interface RpcMsgListener { | ||
27 | + void onRecievedMsg(ClusterAPIProtos.ClusterMessage msg); | ||
28 | + void onSendMsg(ClusterAPIProtos.ClusterMessage msg); | ||
29 | + void onRpcSessionCreateRequestMsg(RpcSessionCreateRequestMsg msg); | ||
30 | + void onBroadcastMsg(RpcBroadcastMsg msg); | ||
48 | } | 31 | } |
application/src/main/java/org/thingsboard/server/service/encoding/DataDecodingEncodingService.java
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.service.encoding; | ||
17 | + | ||
18 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
19 | +import org.thingsboard.server.common.msg.cluster.ServerAddress; | ||
20 | +import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | ||
21 | + | ||
22 | +import java.util.Optional; | ||
23 | + | ||
24 | +public interface DataDecodingEncodingService { | ||
25 | + | ||
26 | + Optional<TbActorMsg> decode(byte[] byteArray); | ||
27 | + | ||
28 | + byte[] encode(TbActorMsg msq); | ||
29 | + | ||
30 | + ClusterAPIProtos.ClusterMessage convertToProtoDataMessage(ServerAddress serverAddress, | ||
31 | + TbActorMsg msg); | ||
32 | + | ||
33 | +} | ||
34 | + |
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.service.encoding; | ||
17 | + | ||
18 | +import com.google.protobuf.ByteString; | ||
19 | +import lombok.extern.slf4j.Slf4j; | ||
20 | +import org.springframework.stereotype.Service; | ||
21 | +import org.springframework.util.SerializationUtils; | ||
22 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
23 | +import org.thingsboard.server.common.msg.cluster.ServerAddress; | ||
24 | +import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | ||
25 | + | ||
26 | +import java.util.Optional; | ||
27 | + | ||
28 | +import static org.thingsboard.server.gen.cluster.ClusterAPIProtos.MessageType.CLUSTER_NETWORK_SERVER_DATA_MESSAGE; | ||
29 | + | ||
30 | + | ||
31 | +@Slf4j | ||
32 | +@Service | ||
33 | +public class ProtoWithJavaSerializationDecodingEncodingService implements DataDecodingEncodingService { | ||
34 | + | ||
35 | + | ||
36 | + @Override | ||
37 | + public Optional<TbActorMsg> decode(byte[] byteArray) { | ||
38 | + try { | ||
39 | + TbActorMsg msg = (TbActorMsg) SerializationUtils.deserialize(byteArray); | ||
40 | + return Optional.of(msg); | ||
41 | + | ||
42 | + } catch (IllegalArgumentException e) { | ||
43 | + log.error("Error during deserialization message, [{}]", e.getMessage()); | ||
44 | + return Optional.empty(); | ||
45 | + } | ||
46 | + } | ||
47 | + | ||
48 | + @Override | ||
49 | + public byte[] encode(TbActorMsg msq) { | ||
50 | + return SerializationUtils.serialize(msq); | ||
51 | + } | ||
52 | + | ||
53 | + @Override | ||
54 | + public ClusterAPIProtos.ClusterMessage convertToProtoDataMessage(ServerAddress serverAddress, | ||
55 | + TbActorMsg msg) { | ||
56 | + return ClusterAPIProtos.ClusterMessage | ||
57 | + .newBuilder() | ||
58 | + .setServerAdresss(ClusterAPIProtos.ServerAddress | ||
59 | + .newBuilder() | ||
60 | + .setHost(serverAddress.getHost()) | ||
61 | + .setPort(serverAddress.getPort()) | ||
62 | + .build()) | ||
63 | + .setMessageType(CLUSTER_NETWORK_SERVER_DATA_MESSAGE) | ||
64 | + .setPayload(ByteString.copyFrom(encode(msg))).build(); | ||
65 | + | ||
66 | + } | ||
67 | +} |
@@ -30,6 +30,8 @@ import org.thingsboard.server.common.data.id.EntityId; | @@ -30,6 +30,8 @@ import org.thingsboard.server.common.data.id.EntityId; | ||
30 | import org.thingsboard.server.common.data.id.TenantId; | 30 | import org.thingsboard.server.common.data.id.TenantId; |
31 | import org.thingsboard.server.common.data.id.UUIDBased; | 31 | import org.thingsboard.server.common.data.id.UUIDBased; |
32 | import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; | 32 | import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; |
33 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
34 | +import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | ||
33 | import org.thingsboard.server.common.msg.cluster.ServerAddress; | 35 | import org.thingsboard.server.common.msg.cluster.ServerAddress; |
34 | import org.thingsboard.server.common.msg.core.ToServerRpcResponseMsg; | 36 | import org.thingsboard.server.common.msg.core.ToServerRpcResponseMsg; |
35 | import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; | 37 | import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; |
@@ -38,6 +40,7 @@ import org.thingsboard.server.dao.audit.AuditLogService; | @@ -38,6 +40,7 @@ import org.thingsboard.server.dao.audit.AuditLogService; | ||
38 | import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg; | 40 | import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg; |
39 | import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse; | 41 | import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse; |
40 | import org.thingsboard.server.extensions.api.plugins.msg.RpcError; | 42 | import org.thingsboard.server.extensions.api.plugins.msg.RpcError; |
43 | +import org.thingsboard.server.gen.cluster.ClusterAPIProtos; | ||
41 | import org.thingsboard.server.service.cluster.routing.ClusterRoutingService; | 44 | import org.thingsboard.server.service.cluster.routing.ClusterRoutingService; |
42 | import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; | 45 | import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; |
43 | import org.thingsboard.server.service.security.model.SecurityUser; | 46 | import org.thingsboard.server.service.security.model.SecurityUser; |
@@ -135,23 +138,16 @@ public class DefaultDeviceRpcService implements DeviceRpcService { | @@ -135,23 +138,16 @@ public class DefaultDeviceRpcService implements DeviceRpcService { | ||
135 | @Override | 138 | @Override |
136 | public void sendRpcReplyToDevice(TenantId tenantId, DeviceId deviceId, int requestId, String body) { | 139 | public void sendRpcReplyToDevice(TenantId tenantId, DeviceId deviceId, int requestId, String body) { |
137 | ToServerRpcResponseActorMsg rpcMsg = new ToServerRpcResponseActorMsg(tenantId, deviceId, new ToServerRpcResponseMsg(requestId, body)); | 140 | ToServerRpcResponseActorMsg rpcMsg = new ToServerRpcResponseActorMsg(tenantId, deviceId, new ToServerRpcResponseMsg(requestId, body)); |
138 | - forward(deviceId, rpcMsg, rpcService::tell); | 141 | + forward(deviceId, rpcMsg); |
139 | } | 142 | } |
140 | 143 | ||
141 | private void sendRpcRequest(ToDeviceRpcRequest msg) { | 144 | private void sendRpcRequest(ToDeviceRpcRequest msg) { |
142 | log.trace("[{}] Forwarding msg {} to device actor!", msg.getDeviceId(), msg); | 145 | log.trace("[{}] Forwarding msg {} to device actor!", msg.getDeviceId(), msg); |
143 | ToDeviceRpcRequestActorMsg rpcMsg = new ToDeviceRpcRequestActorMsg(msg); | 146 | ToDeviceRpcRequestActorMsg rpcMsg = new ToDeviceRpcRequestActorMsg(msg); |
144 | - forward(msg.getDeviceId(), rpcMsg, rpcService::tell); | 147 | + forward(msg.getDeviceId(), rpcMsg); |
145 | } | 148 | } |
146 | 149 | ||
147 | - private <T extends ToDeviceActorNotificationMsg> void forward(DeviceId deviceId, T msg, BiConsumer<ServerAddress, T> rpcFunction) { | ||
148 | - Optional<ServerAddress> instance = routingService.resolveById(deviceId); | ||
149 | - if (instance.isPresent()) { | ||
150 | - log.trace("[{}] Forwarding msg {} to remote device actor!", msg.getTenantId(), msg); | ||
151 | - rpcFunction.accept(instance.get(), msg); | ||
152 | - } else { | ||
153 | - log.trace("[{}] Forwarding msg {} to local device actor!", msg.getTenantId(), msg); | ||
154 | - actorService.onMsg(msg); | ||
155 | - } | 150 | + private <T extends ToDeviceActorNotificationMsg> void forward(DeviceId deviceId, T msg) { |
151 | + actorService.onMsg(new SendToClusterMsg(deviceId, msg)); | ||
156 | } | 152 | } |
157 | } | 153 | } |
@@ -19,79 +19,73 @@ package cluster; | @@ -19,79 +19,73 @@ package cluster; | ||
19 | option java_package = "org.thingsboard.server.gen.cluster"; | 19 | option java_package = "org.thingsboard.server.gen.cluster"; |
20 | option java_outer_classname = "ClusterAPIProtos"; | 20 | option java_outer_classname = "ClusterAPIProtos"; |
21 | 21 | ||
22 | -message ServerAddress { | ||
23 | - string host = 1; | ||
24 | - int32 port = 2; | ||
25 | -} | ||
26 | - | ||
27 | -message Uid { | ||
28 | - sint64 pluginUuidMsb = 1; | ||
29 | - sint64 pluginUuidLsb = 2; | ||
30 | -} | ||
31 | - | ||
32 | -message PluginAddress { | ||
33 | - Uid pluginId = 1; | ||
34 | - Uid tenantId = 2; | ||
35 | -} | ||
36 | - | ||
37 | -message ToPluginRpcMessage { | ||
38 | - PluginAddress address = 1; | ||
39 | - int32 clazz = 2; | ||
40 | - bytes data = 3; | ||
41 | -} | ||
42 | - | ||
43 | -message ToDeviceActorRpcMessage { | ||
44 | - bytes data = 1; | ||
45 | -} | ||
46 | - | ||
47 | -message ToDeviceSessionActorRpcMessage { | ||
48 | - bytes data = 1; | ||
49 | -} | ||
50 | - | ||
51 | -message ToDeviceActorNotificationRpcMessage { | ||
52 | - bytes data = 1; | ||
53 | -} | ||
54 | - | ||
55 | -message ToAllNodesRpcMessage { | ||
56 | - bytes data = 1; | ||
57 | -} | ||
58 | - | ||
59 | -message ConnectRpcMessage { | ||
60 | - ServerAddress serverAddress = 1; | ||
61 | -} | ||
62 | - | ||
63 | -message ToDeviceRpcRequestRpcMessage { | ||
64 | - Uid deviceTenantId = 2; | ||
65 | - Uid deviceId = 3; | ||
66 | - | ||
67 | - Uid msgId = 4; | ||
68 | - bool oneway = 5; | ||
69 | - int64 expTime = 6; | ||
70 | - string method = 7; | ||
71 | - string params = 8; | ||
72 | -} | ||
73 | - | ||
74 | -message ToPluginRpcResponseRpcMessage { | ||
75 | - Uid msgId = 2; | ||
76 | - string response = 3; | ||
77 | - string error = 4; | ||
78 | -} | ||
79 | - | ||
80 | -message ToRpcServerMessage { | ||
81 | - ConnectRpcMessage connectMsg = 1; | ||
82 | - ToPluginRpcMessage toPluginRpcMsg = 2; | ||
83 | - ToDeviceActorRpcMessage toDeviceActorRpcMsg = 3; | ||
84 | - ToDeviceSessionActorRpcMessage toDeviceSessionActorRpcMsg = 4; | ||
85 | - ToDeviceActorNotificationRpcMessage toDeviceActorNotificationRpcMsg = 5; | ||
86 | - ToAllNodesRpcMessage toAllNodesRpcMsg = 6; | ||
87 | - ToDeviceRpcRequestRpcMessage toDeviceRpcRequestRpcMsg = 7; | ||
88 | - ToPluginRpcResponseRpcMessage toPluginRpcResponseRpcMsg = 8; | ||
89 | -} | 22 | +//message Uid { |
23 | +// sint64 pluginUuidMsb = 1; | ||
24 | +// sint64 pluginUuidLsb = 2; | ||
25 | +//} | ||
26 | +// | ||
27 | +//message PluginAddress { | ||
28 | +// Uid pluginId = 1; | ||
29 | +// Uid tenantId = 2; | ||
30 | +//} | ||
31 | +// | ||
32 | +//message ToPluginRpcMessage { | ||
33 | +// PluginAddress address = 1; | ||
34 | +// int32 clazz = 2; | ||
35 | +// bytes data = 3; | ||
36 | +//} | ||
37 | +// | ||
38 | +//message ToDeviceActorRpcMessage { | ||
39 | +// bytes data = 1; | ||
40 | +//} | ||
41 | +// | ||
42 | +//message ToDeviceSessionActorRpcMessage { | ||
43 | +// bytes data = 1; | ||
44 | +//} | ||
45 | +// | ||
46 | +//message ToDeviceActorNotificationRpcMessage { | ||
47 | +// bytes data = 1; | ||
48 | +//} | ||
49 | +// | ||
50 | +//message ToAllNodesRpcMessage { | ||
51 | +// bytes data = 1; | ||
52 | +//} | ||
53 | +// | ||
54 | +//message ConnectRpcMessage { | ||
55 | +// ServerAddress serverAddress = 1; | ||
56 | +//} | ||
57 | +// | ||
58 | +//message ToDeviceRpcRequestRpcMessage { | ||
59 | +// Uid deviceTenantId = 2; | ||
60 | +// Uid deviceId = 3; | ||
61 | +// | ||
62 | +// Uid msgId = 4; | ||
63 | +// bool oneway = 5; | ||
64 | +// int64 expTime = 6; | ||
65 | +// string method = 7; | ||
66 | +// string params = 8; | ||
67 | +//} | ||
68 | +// | ||
69 | +//message ToPluginRpcResponseRpcMessage { | ||
70 | +// Uid msgId = 2; | ||
71 | +// string response = 3; | ||
72 | +// string error = 4; | ||
73 | +//} | ||
74 | +// | ||
75 | +//message ToRpcServerMessage { | ||
76 | +// ConnectRpcMessage connectMsg = 1; | ||
77 | +// ToPluginRpcMessage toPluginRpcMsg = 2; | ||
78 | +// ToDeviceActorRpcMessage toDeviceActorRpcMsg = 3; | ||
79 | +// ToDeviceSessionActorRpcMessage toDeviceSessionActorRpcMsg = 4; | ||
80 | +// ToDeviceActorNotificationRpcMessage toDeviceActorNotificationRpcMsg = 5; | ||
81 | +// ToAllNodesRpcMessage toAllNodesRpcMsg = 6; | ||
82 | +// ToDeviceRpcRequestRpcMessage toDeviceRpcRequestRpcMsg = 7; | ||
83 | +// ToPluginRpcResponseRpcMessage toPluginRpcResponseRpcMsg = 8; | ||
84 | +//} | ||
90 | 85 | ||
91 | service ClusterRpcService { | 86 | service ClusterRpcService { |
92 | - rpc handlePluginMsgs(stream ToRpcServerMessage) returns (stream ToRpcServerMessage) {} | 87 | + rpc handleMsgs(stream ClusterMessage) returns (stream ClusterMessage) {} |
93 | } | 88 | } |
94 | - | ||
95 | message ClusterMessage { | 89 | message ClusterMessage { |
96 | MessageType messageType = 1; | 90 | MessageType messageType = 1; |
97 | MessageMataInfo messageMetaInfo = 2; | 91 | MessageMataInfo messageMetaInfo = 2; |
@@ -29,6 +29,11 @@ public enum MsgType { | @@ -29,6 +29,11 @@ public enum MsgType { | ||
29 | CLUSTER_EVENT_MSG, | 29 | CLUSTER_EVENT_MSG, |
30 | 30 | ||
31 | /** | 31 | /** |
32 | + * All messages, could be send to cluster | ||
33 | + */ | ||
34 | + SEND_TO_CLUSTER_MSG, | ||
35 | + | ||
36 | + /** | ||
32 | * ADDED/UPDATED/DELETED events for main entities. | 37 | * ADDED/UPDATED/DELETED events for main entities. |
33 | * | 38 | * |
34 | * See {@link org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg} | 39 | * See {@link org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg} |
common/message/src/main/java/org/thingsboard/server/common/msg/cluster/SendToClusterMsg.java
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.common.msg.cluster; | ||
17 | + | ||
18 | +import lombok.Data; | ||
19 | +import org.thingsboard.server.common.data.id.DeviceId; | ||
20 | +import org.thingsboard.server.common.data.id.EntityId; | ||
21 | +import org.thingsboard.server.common.msg.MsgType; | ||
22 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
23 | + | ||
24 | +@Data | ||
25 | +public class SendToClusterMsg implements TbActorMsg { | ||
26 | + | ||
27 | + private TbActorMsg msg; | ||
28 | + private EntityId entityId; | ||
29 | + | ||
30 | + public SendToClusterMsg(EntityId entityId, TbActorMsg msg) { | ||
31 | + this.entityId = entityId; | ||
32 | + this.msg = msg; | ||
33 | + } | ||
34 | + | ||
35 | + | ||
36 | + @Override | ||
37 | + public MsgType getMsgType() { | ||
38 | + return MsgType.SEND_TO_CLUSTER_MSG; | ||
39 | + } | ||
40 | +} |
@@ -15,10 +15,12 @@ | @@ -15,10 +15,12 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.common.msg.cluster; | 16 | package org.thingsboard.server.common.msg.cluster; |
17 | 17 | ||
18 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
19 | + | ||
18 | import java.io.Serializable; | 20 | import java.io.Serializable; |
19 | 21 | ||
20 | /** | 22 | /** |
21 | * @author Andrew Shvayka | 23 | * @author Andrew Shvayka |
22 | */ | 24 | */ |
23 | -public interface ToAllNodesMsg extends Serializable { | 25 | +public interface ToAllNodesMsg extends Serializable, TbActorMsg { |
24 | } | 26 | } |
@@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
16 | package org.thingsboard.server.common.msg.core; | 16 | package org.thingsboard.server.common.msg.core; |
17 | 17 | ||
18 | import org.thingsboard.server.common.data.id.SessionId; | 18 | import org.thingsboard.server.common.data.id.SessionId; |
19 | +import org.thingsboard.server.common.msg.MsgType; | ||
19 | import org.thingsboard.server.common.msg.session.ToDeviceMsg; | 20 | import org.thingsboard.server.common.msg.session.ToDeviceMsg; |
20 | 21 | ||
21 | public class BasicToDeviceSessionActorMsg implements ToDeviceSessionActorMsg { | 22 | public class BasicToDeviceSessionActorMsg implements ToDeviceSessionActorMsg { |
@@ -44,4 +45,8 @@ public class BasicToDeviceSessionActorMsg implements ToDeviceSessionActorMsg { | @@ -44,4 +45,8 @@ public class BasicToDeviceSessionActorMsg implements ToDeviceSessionActorMsg { | ||
44 | return "BasicToSessionResponseMsg [msg=" + msg + ", sessionId=" + sessionId + "]"; | 45 | return "BasicToSessionResponseMsg [msg=" + msg + ", sessionId=" + sessionId + "]"; |
45 | } | 46 | } |
46 | 47 | ||
48 | + @Override | ||
49 | + public MsgType getMsgType() { | ||
50 | + return null; | ||
51 | + } | ||
47 | } | 52 | } |
@@ -15,6 +15,7 @@ | @@ -15,6 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.common.msg.core; | 16 | package org.thingsboard.server.common.msg.core; |
17 | 17 | ||
18 | +import org.thingsboard.server.common.msg.TbActorMsg; | ||
18 | import org.thingsboard.server.common.msg.aware.SessionAwareMsg; | 19 | import org.thingsboard.server.common.msg.aware.SessionAwareMsg; |
19 | import org.thingsboard.server.common.msg.session.ToDeviceMsg; | 20 | import org.thingsboard.server.common.msg.session.ToDeviceMsg; |
20 | 21 | ||
@@ -23,7 +24,7 @@ import java.io.Serializable; | @@ -23,7 +24,7 @@ import java.io.Serializable; | ||
23 | /** | 24 | /** |
24 | * @author Andrew Shvayka | 25 | * @author Andrew Shvayka |
25 | */ | 26 | */ |
26 | -public interface ToDeviceSessionActorMsg extends SessionAwareMsg, Serializable { | 27 | +public interface ToDeviceSessionActorMsg extends SessionAwareMsg, Serializable, TbActorMsg { |
27 | 28 | ||
28 | ToDeviceMsg getMsg(); | 29 | ToDeviceMsg getMsg(); |
29 | } | 30 | } |
@@ -20,7 +20,6 @@ import lombok.ToString; | @@ -20,7 +20,6 @@ import lombok.ToString; | ||
20 | import org.thingsboard.server.common.data.EntityType; | 20 | import org.thingsboard.server.common.data.EntityType; |
21 | import org.thingsboard.server.common.data.id.*; | 21 | import org.thingsboard.server.common.data.id.*; |
22 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; | 22 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; |
23 | -import org.thingsboard.server.common.data.rule.RuleChain; | ||
24 | import org.thingsboard.server.common.msg.MsgType; | 23 | import org.thingsboard.server.common.msg.MsgType; |
25 | import org.thingsboard.server.common.msg.TbActorMsg; | 24 | import org.thingsboard.server.common.msg.TbActorMsg; |
26 | import org.thingsboard.server.common.msg.aware.TenantAwareMsg; | 25 | import org.thingsboard.server.common.msg.aware.TenantAwareMsg; |