5 changed files with 194 additions and 635 deletions
@ -1,227 +0,0 @@ |
|||
/** |
|||
* Copyright © 2016-2020 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.service.transport; |
|||
|
|||
import akka.actor.ActorRef; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|||
import org.springframework.stereotype.Service; |
|||
import org.thingsboard.common.util.DonAsynchron; |
|||
import org.thingsboard.server.actors.ActorSystemContext; |
|||
import org.thingsboard.server.common.data.id.DeviceId; |
|||
import org.thingsboard.server.common.data.id.TenantId; |
|||
import org.thingsboard.server.common.msg.cluster.ServerAddress; |
|||
import org.thingsboard.server.common.transport.TransportServiceCallback; |
|||
import org.thingsboard.server.common.transport.service.AbstractTransportService; |
|||
import org.thingsboard.server.dao.device.ClaimDevicesService; |
|||
import org.thingsboard.server.gen.transport.TransportProtos; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ClaimDeviceMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.DeviceActorToTransportMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SessionEventMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SubscribeToAttributeUpdatesMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SubscribeToRPCMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ToDeviceRpcResponseMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg; |
|||
import org.thingsboard.server.service.cluster.routing.ClusterRoutingService; |
|||
import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; |
|||
import org.thingsboard.server.service.encoding.DataDecodingEncodingService; |
|||
import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; |
|||
|
|||
import javax.annotation.PostConstruct; |
|||
import javax.annotation.PreDestroy; |
|||
import java.util.Optional; |
|||
import java.util.UUID; |
|||
import java.util.function.Consumer; |
|||
|
|||
/** |
|||
* Created by ashvayka on 12.10.18. |
|||
*/ |
|||
@Slf4j |
|||
@Service |
|||
@ConditionalOnProperty(prefix = "transport", value = "type", havingValue = "local") |
|||
public class LocalTransportService extends AbstractTransportService implements RuleEngineTransportService { |
|||
|
|||
@Autowired |
|||
private TransportApiService transportApiService; |
|||
|
|||
@Autowired |
|||
private ActorSystemContext actorContext; |
|||
|
|||
//TODO: completely replace this routing with the Kafka routing by partition ids.
|
|||
@Autowired |
|||
private ClusterRoutingService routingService; |
|||
@Autowired |
|||
private ClusterRpcService rpcService; |
|||
@Autowired |
|||
private DataDecodingEncodingService encodingService; |
|||
@Autowired |
|||
private ClaimDevicesService claimDevicesService; |
|||
|
|||
@PostConstruct |
|||
public void init() { |
|||
super.init(); |
|||
} |
|||
|
|||
@PreDestroy |
|||
public void destroy() { |
|||
super.destroy(); |
|||
} |
|||
|
|||
@Override |
|||
public void process(ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponseMsg> callback) { |
|||
DonAsynchron.withCallback( |
|||
transportApiService.handle(TransportApiRequestMsg.newBuilder().setValidateTokenRequestMsg(msg).build()), |
|||
transportApiResponseMsg -> { |
|||
if (callback != null) { |
|||
callback.onSuccess(transportApiResponseMsg.getValidateTokenResponseMsg()); |
|||
} |
|||
}, |
|||
getThrowableConsumer(callback), transportCallbackExecutor); |
|||
} |
|||
|
|||
@Override |
|||
public void process(ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponseMsg> callback) { |
|||
DonAsynchron.withCallback( |
|||
transportApiService.handle(TransportApiRequestMsg.newBuilder().setValidateX509CertRequestMsg(msg).build()), |
|||
transportApiResponseMsg -> { |
|||
if (callback != null) { |
|||
callback.onSuccess(transportApiResponseMsg.getValidateTokenResponseMsg()); |
|||
} |
|||
}, |
|||
getThrowableConsumer(callback), transportCallbackExecutor); |
|||
} |
|||
|
|||
@Override |
|||
public void process(GetOrCreateDeviceFromGatewayRequestMsg msg, TransportServiceCallback<GetOrCreateDeviceFromGatewayResponseMsg> callback) { |
|||
DonAsynchron.withCallback( |
|||
transportApiService.handle(TransportApiRequestMsg.newBuilder().setGetOrCreateDeviceRequestMsg(msg).build()), |
|||
transportApiResponseMsg -> { |
|||
if (callback != null) { |
|||
callback.onSuccess(transportApiResponseMsg.getGetOrCreateDeviceResponseMsg()); |
|||
} |
|||
}, |
|||
getThrowableConsumer(callback), transportCallbackExecutor); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, SessionEventMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setSessionEvent(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, PostTelemetryMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setPostTelemetry(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, PostAttributeMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setPostAttributes(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, GetAttributeRequestMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setGetAttributes(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
public void process(SessionInfoProto sessionInfo, TransportProtos.SubscriptionInfoProto msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setSubscriptionInfo(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, SubscribeToAttributeUpdatesMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setSubscribeToAttributes(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, SubscribeToRPCMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setSubscribeToRPC(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, ToDeviceRpcResponseMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setToDeviceRPCCallResponse(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, ToServerRpcRequestMsg msg, TransportServiceCallback<Void> callback) { |
|||
forwardToDeviceActor(TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setToServerRPCCallRequest(msg).build(), callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void registerClaimingInfo(SessionInfoProto sessionInfo, ClaimDeviceMsg msg, TransportServiceCallback<Void> callback) { |
|||
TransportToDeviceActorMsg toDeviceActorMsg = TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setClaimDevice(msg).build(); |
|||
|
|||
TransportToDeviceActorMsgWrapper wrapper = new TransportToDeviceActorMsgWrapper(toDeviceActorMsg); |
|||
Optional<ServerAddress> address = routingService.resolveById(wrapper.getDeviceId()); |
|||
if (address.isPresent()) { |
|||
rpcService.tell(encodingService.convertToProtoDataMessage(address.get(), wrapper)); |
|||
callback.onSuccess(null); |
|||
} else { |
|||
TenantId tenantId = new TenantId(new UUID(sessionInfo.getTenantIdMSB(), sessionInfo.getTenantIdLSB())); |
|||
DeviceId deviceId = new DeviceId(new UUID(msg.getDeviceIdMSB(), msg.getDeviceIdLSB())); |
|||
DonAsynchron.withCallback(claimDevicesService.registerClaimingInfo(tenantId, deviceId, msg.getSecretKey(), msg.getDurationMs()), |
|||
callback::onSuccess, callback::onError); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void process(String nodeId, DeviceActorToTransportMsg msg) { |
|||
process(nodeId, msg, null, null); |
|||
} |
|||
|
|||
@Override |
|||
public void process(String nodeId, DeviceActorToTransportMsg msg, Runnable onSuccess, Consumer<Throwable> onFailure) { |
|||
processToTransportMsg(msg); |
|||
if (onSuccess != null) { |
|||
onSuccess.run(); |
|||
} |
|||
} |
|||
|
|||
private void forwardToDeviceActor(TransportToDeviceActorMsg toDeviceActorMsg, TransportServiceCallback<Void> callback) { |
|||
TransportToDeviceActorMsgWrapper wrapper = new TransportToDeviceActorMsgWrapper(toDeviceActorMsg); |
|||
Optional<ServerAddress> address = routingService.resolveById(wrapper.getDeviceId()); |
|||
if (address.isPresent()) { |
|||
rpcService.tell(encodingService.convertToProtoDataMessage(address.get(), wrapper)); |
|||
} else { |
|||
actorContext.getAppActor().tell(wrapper, ActorRef.noSender()); |
|||
} |
|||
if (callback != null) { |
|||
callback.onSuccess(null); |
|||
} |
|||
} |
|||
|
|||
private <T> Consumer<Throwable> getThrowableConsumer(TransportServiceCallback<T> callback) { |
|||
return e -> { |
|||
if (callback != null) { |
|||
callback.onError(e); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
} |
|||
@ -1,341 +0,0 @@ |
|||
/** |
|||
* Copyright © 2016-2020 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.common.transport.service; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; |
|||
import org.springframework.stereotype.Service; |
|||
import org.thingsboard.common.util.ThingsBoardThreadFactory; |
|||
import org.thingsboard.server.TbQueueCallback; |
|||
import org.thingsboard.server.TbQueueMsgMetadata; |
|||
import org.thingsboard.server.common.TbProtoQueueMsg; |
|||
import org.thingsboard.server.common.transport.TransportServiceCallback; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ClaimDeviceMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SessionEventMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SubscribeToAttributeUpdatesMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SubscribeToRPCMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.SubscriptionInfoProto; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ToDeviceRpcResponseMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg; |
|||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg; |
|||
import org.thingsboard.server.kafka.AsyncCallbackTemplate; |
|||
import org.thingsboard.server.kafka.TbKafkaSettings; |
|||
import org.thingsboard.server.kafka.TbNodeIdProvider; |
|||
|
|||
import javax.annotation.PostConstruct; |
|||
import javax.annotation.PreDestroy; |
|||
import java.util.List; |
|||
import java.util.UUID; |
|||
import java.util.concurrent.ExecutorService; |
|||
import java.util.concurrent.Executors; |
|||
|
|||
/** |
|||
* Created by ashvayka on 05.10.18. |
|||
*/ |
|||
@ConditionalOnExpression("'${transport.type:null}'=='null'") |
|||
@Service |
|||
@Slf4j |
|||
public class RemoteTransportService extends AbstractTransportService { |
|||
|
|||
@Value("${kafka.rule_engine.topic}") |
|||
private String ruleEngineTopic; |
|||
@Value("${kafka.notifications.topic}") |
|||
private String notificationsTopic; |
|||
@Value("${kafka.notifications.poll_interval}") |
|||
private int notificationsPollDuration; |
|||
@Value("${kafka.notifications.auto_commit_interval}") |
|||
private int notificationsAutoCommitInterval; |
|||
@Value("${kafka.transport_api.requests_topic}") |
|||
private String transportApiRequestsTopic; |
|||
@Value("${kafka.transport_api.responses_topic}") |
|||
private String transportApiResponsesTopic; |
|||
@Value("${kafka.transport_api.max_pending_requests}") |
|||
private long maxPendingRequests; |
|||
@Value("${kafka.transport_api.max_requests_timeout}") |
|||
private long maxRequestsTimeout; |
|||
@Value("${kafka.transport_api.response_poll_interval}") |
|||
private int responsePollDuration; |
|||
@Value("${kafka.transport_api.response_auto_commit_interval}") |
|||
private int autoCommitInterval; |
|||
|
|||
@Autowired |
|||
private TbKafkaSettings kafkaSettings; |
|||
//We use this to get the node id. We should replace this with a component that provides the node id.
|
|||
@Autowired |
|||
private TbNodeIdProvider nodeIdProvider; |
|||
|
|||
private ExecutorService mainConsumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("remote-transport-consumer")); |
|||
|
|||
private volatile boolean stopped = false; |
|||
|
|||
@PostConstruct |
|||
public void init() { |
|||
super.init(); |
|||
|
|||
// TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<TransportApiRequestMsg> requestBuilder = TBKafkaProducerTemplate.builder();
|
|||
// requestBuilder.settings(kafkaSettings);
|
|||
// requestBuilder.clientId("producer-transport-api-request-" + nodeIdProvider.getNodeId());
|
|||
// requestBuilder.defaultTopic(transportApiRequestsTopic);
|
|||
// requestBuilder.encoder(new TransportApiRequestEncoder());
|
|||
//
|
|||
// TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<TransportApiResponseMsg> responseBuilder = TBKafkaConsumerTemplate.builder();
|
|||
// responseBuilder.settings(kafkaSettings);
|
|||
// responseBuilder.topic(transportApiResponsesTopic + "." + nodeIdProvider.getNodeId());
|
|||
// responseBuilder.clientId("transport-api-client-" + nodeIdProvider.getNodeId());
|
|||
// responseBuilder.groupId("transport-api-client");
|
|||
// responseBuilder.autoCommit(true);
|
|||
// responseBuilder.autoCommitIntervalMs(autoCommitInterval);
|
|||
// responseBuilder.decoder(new TransportApiResponseDecoder());
|
|||
//
|
|||
// TbKafkaRequestTemplate.TbKafkaRequestTemplateBuilder
|
|||
// <TransportApiRequestMsg, TransportApiResponseMsg> builder = TbKafkaRequestTemplate.builder();
|
|||
// builder.requestTemplate(requestBuilder.build());
|
|||
// builder.responseTemplate(responseBuilder.build());
|
|||
// builder.maxPendingRequests(maxPendingRequests);
|
|||
// builder.maxRequestTimeout(maxRequestsTimeout);
|
|||
// builder.pollInterval(responsePollDuration);
|
|||
// transportApiTemplate = builder.build();
|
|||
// transportApiTemplate.init();
|
|||
//
|
|||
// TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<ToRuleEngineMsg> ruleEngineProducerBuilder = TBKafkaProducerTemplate.builder();
|
|||
// ruleEngineProducerBuilder.settings(kafkaSettings);
|
|||
// ruleEngineProducerBuilder.clientId("producer-rule-engine-request-" + nodeIdProvider.getNodeId());
|
|||
// ruleEngineProducerBuilder.defaultTopic(ruleEngineTopic);
|
|||
// ruleEngineProducerBuilder.encoder(new ToRuleEngineMsgEncoder());
|
|||
// ruleEngineProducer = ruleEngineProducerBuilder.build();
|
|||
// ruleEngineProducer.init();
|
|||
//
|
|||
// String notificationsTopicName = notificationsTopic + "." + nodeIdProvider.getNodeId();
|
|||
//
|
|||
// try {
|
|||
// TBKafkaAdmin admin = new TBKafkaAdmin(kafkaSettings);
|
|||
// CreateTopicsResult result = admin.createTopic(new NewTopic(notificationsTopicName, 1, (short) 1));
|
|||
// result.all().get();
|
|||
// } catch (Exception e) {
|
|||
// log.trace("Failed to create topic: {}", e.getMessage(), e);
|
|||
// }
|
|||
//
|
|||
// TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<ToTransportMsg> mainConsumerBuilder = TBKafkaConsumerTemplate.builder();
|
|||
// mainConsumerBuilder.settings(kafkaSettings);
|
|||
// mainConsumerBuilder.topic(notificationsTopicName);
|
|||
// mainConsumerBuilder.clientId("transport-" + nodeIdProvider.getNodeId());
|
|||
// mainConsumerBuilder.groupId("transport");
|
|||
// mainConsumerBuilder.autoCommit(true);
|
|||
// mainConsumerBuilder.autoCommitIntervalMs(notificationsAutoCommitInterval);
|
|||
// mainConsumerBuilder.decoder(new ToTransportMsgResponseDecoder());
|
|||
// mainConsumer = mainConsumerBuilder.build();
|
|||
// mainConsumer.subscribe();
|
|||
|
|||
mainConsumerExecutor.execute(() -> { |
|||
while (!stopped) { |
|||
try { |
|||
List<TbProtoQueueMsg<ToTransportMsg>> records = transportNotificationsConsumer.poll(notificationsPollDuration); |
|||
records.forEach(record -> { |
|||
try { |
|||
ToTransportMsg toTransportMsg = record.getValue(); |
|||
if (toTransportMsg.hasToDeviceSessionMsg()) { |
|||
processToTransportMsg(toTransportMsg.getToDeviceSessionMsg()); |
|||
} |
|||
} catch (Throwable e) { |
|||
log.warn("Failed to process the notification.", e); |
|||
} |
|||
}); |
|||
} catch (Exception e) { |
|||
log.warn("Failed to obtain messages from queue.", e); |
|||
try { |
|||
Thread.sleep(notificationsPollDuration); |
|||
} catch (InterruptedException e2) { |
|||
log.trace("Failed to wait until the server has capacity to handle new requests", e2); |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
|
|||
@PreDestroy |
|||
public void destroy() { |
|||
super.destroy(); |
|||
stopped = true; |
|||
// if (transportApiTemplate != null) {
|
|||
// transportApiTemplate.stop();
|
|||
// }
|
|||
// if (mainConsumer != null) {
|
|||
// mainConsumer.unsubscribe();
|
|||
// }
|
|||
if (mainConsumerExecutor != null) { |
|||
mainConsumerExecutor.shutdownNow(); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void process(ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponseMsg> callback) { |
|||
log.trace("Processing msg: {}", msg); |
|||
TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateTokenRequestMsg(msg).build()); |
|||
AsyncCallbackTemplate.withCallback(transportApiRequestTemplate.send(protoMsg), |
|||
response -> callback.onSuccess(response.getValue().getValidateTokenResponseMsg()), callback::onError, transportCallbackExecutor); |
|||
} |
|||
|
|||
@Override |
|||
public void process(ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponseMsg> callback) { |
|||
log.trace("Processing msg: {}", msg); |
|||
TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateX509CertRequestMsg(msg).build()); |
|||
AsyncCallbackTemplate.withCallback(transportApiRequestTemplate.send(protoMsg), |
|||
response -> callback.onSuccess(response.getValue().getValidateTokenResponseMsg()), callback::onError, transportCallbackExecutor); |
|||
} |
|||
|
|||
@Override |
|||
public void process(GetOrCreateDeviceFromGatewayRequestMsg msg, TransportServiceCallback<GetOrCreateDeviceFromGatewayResponseMsg> callback) { |
|||
log.trace("Processing msg: {}", msg); |
|||
TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setGetOrCreateDeviceRequestMsg(msg).build()); |
|||
AsyncCallbackTemplate.withCallback(transportApiRequestTemplate.send(protoMsg), |
|||
response -> callback.onSuccess(response.getValue().getGetOrCreateDeviceResponseMsg()), callback::onError, transportCallbackExecutor); |
|||
} |
|||
|
|||
@Override |
|||
public void process(SessionInfoProto sessionInfo, SubscriptionInfoProto msg, TransportServiceCallback<Void> callback) { |
|||
if (log.isTraceEnabled()) { |
|||
log.trace("[{}] Processing msg: {}", toId(sessionInfo), msg); |
|||
} |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setSubscriptionInfo(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, SessionEventMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setSessionEvent(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, PostTelemetryMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setPostTelemetry(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, PostAttributeMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setPostAttributes(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, GetAttributeRequestMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setGetAttributes(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, SubscribeToAttributeUpdatesMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setSubscribeToAttributes(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, SubscribeToRPCMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setSubscribeToRPC(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, ToDeviceRpcResponseMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setToDeviceRPCCallResponse(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void doProcess(SessionInfoProto sessionInfo, ToServerRpcRequestMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setToServerRPCCallRequest(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
@Override |
|||
protected void registerClaimingInfo(SessionInfoProto sessionInfo, ClaimDeviceMsg msg, TransportServiceCallback<Void> callback) { |
|||
ToRuleEngineMsg toRuleEngineMsg = ToRuleEngineMsg.newBuilder().setToDeviceActorMsg( |
|||
TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo) |
|||
.setClaimDevice(msg).build() |
|||
).build(); |
|||
send(sessionInfo, toRuleEngineMsg, callback); |
|||
} |
|||
|
|||
private void send(SessionInfoProto sessionInfo, ToRuleEngineMsg toRuleEngineMsg, TransportServiceCallback<Void> callback) { |
|||
ruleEngineMsgProducer.send(new TbProtoQueueMsg<>(getRoutingKey(sessionInfo), toRuleEngineMsg), callback != null ? |
|||
new TransportTbQueueCallback(callback) : null); |
|||
|
|||
} |
|||
|
|||
private class TransportTbQueueCallback implements TbQueueCallback { |
|||
private final TransportServiceCallback<Void> callback; |
|||
|
|||
private TransportTbQueueCallback(TransportServiceCallback<Void> callback) { |
|||
this.callback = callback; |
|||
} |
|||
|
|||
@Override |
|||
public void onSuccess(TbQueueMsgMetadata metadata) { |
|||
RemoteTransportService.this.transportCallbackExecutor.submit(() -> { |
|||
callback.onSuccess(null); |
|||
}); |
|||
} |
|||
|
|||
@Override |
|||
public void onFailure(Throwable t) { |
|||
RemoteTransportService.this.transportCallbackExecutor.submit(() -> { |
|||
callback.onError(t); |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue