|
|
|
@ -23,7 +23,6 @@ import com.google.gson.JsonObject; |
|
|
|
import com.google.protobuf.ByteString; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
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.common.data.DeviceProfile; |
|
|
|
@ -53,7 +52,6 @@ import org.thingsboard.server.common.transport.TransportTenantProfileCache; |
|
|
|
import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse; |
|
|
|
import org.thingsboard.server.common.transport.auth.TransportDeviceInfo; |
|
|
|
import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse; |
|
|
|
import org.thingsboard.server.common.transport.limits.TransportRateLimit; |
|
|
|
import org.thingsboard.server.common.transport.limits.TransportRateLimitService; |
|
|
|
import org.thingsboard.server.common.transport.limits.TransportRateLimitType; |
|
|
|
import org.thingsboard.server.common.transport.profile.TenantProfileUpdateResult; |
|
|
|
@ -79,6 +77,7 @@ import org.thingsboard.server.queue.discovery.PartitionService; |
|
|
|
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; |
|
|
|
import org.thingsboard.server.queue.provider.TbQueueProducerProvider; |
|
|
|
import org.thingsboard.server.queue.provider.TbTransportQueueFactory; |
|
|
|
import org.thingsboard.server.queue.scheduler.SchedulerComponent; |
|
|
|
import org.thingsboard.server.queue.util.TbTransportComponent; |
|
|
|
|
|
|
|
import javax.annotation.PostConstruct; |
|
|
|
@ -94,7 +93,6 @@ import java.util.concurrent.ConcurrentMap; |
|
|
|
import java.util.concurrent.ExecutionException; |
|
|
|
import java.util.concurrent.ExecutorService; |
|
|
|
import java.util.concurrent.Executors; |
|
|
|
import java.util.concurrent.ScheduledExecutorService; |
|
|
|
import java.util.concurrent.ScheduledFuture; |
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
@ -126,6 +124,7 @@ public class DefaultTransportService implements TransportService { |
|
|
|
private final TransportTenantProfileCache tenantProfileCache; |
|
|
|
private final TransportRateLimitService rateLimitService; |
|
|
|
private final DataDecodingEncodingService dataDecodingEncodingService; |
|
|
|
private final SchedulerComponent scheduler; |
|
|
|
|
|
|
|
protected TbQueueRequestTemplate<TbProtoQueueMsg<TransportApiRequestMsg>, TbProtoQueueMsg<TransportApiResponseMsg>> transportApiRequestTemplate; |
|
|
|
protected TbQueueProducer<TbProtoQueueMsg<ToRuleEngineMsg>> ruleEngineMsgProducer; |
|
|
|
@ -136,7 +135,6 @@ public class DefaultTransportService implements TransportService { |
|
|
|
protected MessagesStats tbCoreProducerStats; |
|
|
|
protected MessagesStats transportApiStats; |
|
|
|
|
|
|
|
protected ScheduledExecutorService schedulerExecutor; |
|
|
|
protected ExecutorService transportCallbackExecutor; |
|
|
|
private ExecutorService mainConsumerExecutor; |
|
|
|
|
|
|
|
@ -152,7 +150,7 @@ public class DefaultTransportService implements TransportService { |
|
|
|
StatsFactory statsFactory, |
|
|
|
TransportDeviceProfileCache deviceProfileCache, |
|
|
|
TransportTenantProfileCache tenantProfileCache, |
|
|
|
TransportRateLimitService rateLimitService, DataDecodingEncodingService dataDecodingEncodingService) { |
|
|
|
TransportRateLimitService rateLimitService, DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler) { |
|
|
|
this.serviceInfoProvider = serviceInfoProvider; |
|
|
|
this.queueProvider = queueProvider; |
|
|
|
this.producerProvider = producerProvider; |
|
|
|
@ -162,6 +160,7 @@ public class DefaultTransportService implements TransportService { |
|
|
|
this.tenantProfileCache = tenantProfileCache; |
|
|
|
this.rateLimitService = rateLimitService; |
|
|
|
this.dataDecodingEncodingService = dataDecodingEncodingService; |
|
|
|
this.scheduler = scheduler; |
|
|
|
} |
|
|
|
|
|
|
|
@PostConstruct |
|
|
|
@ -169,9 +168,8 @@ public class DefaultTransportService implements TransportService { |
|
|
|
this.ruleEngineProducerStats = statsFactory.createMessagesStats(StatsType.RULE_ENGINE.getName() + ".producer"); |
|
|
|
this.tbCoreProducerStats = statsFactory.createMessagesStats(StatsType.CORE.getName() + ".producer"); |
|
|
|
this.transportApiStats = statsFactory.createMessagesStats(StatsType.TRANSPORT.getName() + ".producer"); |
|
|
|
this.schedulerExecutor = Executors.newSingleThreadScheduledExecutor(ThingsBoardThreadFactory.forName("transport-scheduler")); |
|
|
|
this.transportCallbackExecutor = Executors.newWorkStealingPool(20); |
|
|
|
this.schedulerExecutor.scheduleAtFixedRate(this::checkInactivityAndReportActivity, new Random().nextInt((int) sessionReportTimeout), sessionReportTimeout, TimeUnit.MILLISECONDS); |
|
|
|
this.scheduler.scheduleAtFixedRate(this::checkInactivityAndReportActivity, new Random().nextInt((int) sessionReportTimeout), sessionReportTimeout, TimeUnit.MILLISECONDS); |
|
|
|
transportApiRequestTemplate = queueProvider.createTransportApiRequestTemplate(); |
|
|
|
transportApiRequestTemplate.setMessagesStats(transportApiStats); |
|
|
|
ruleEngineMsgProducer = producerProvider.getRuleEngineMsgProducer(); |
|
|
|
@ -217,9 +215,6 @@ public class DefaultTransportService implements TransportService { |
|
|
|
if (transportNotificationsConsumer != null) { |
|
|
|
transportNotificationsConsumer.unsubscribe(); |
|
|
|
} |
|
|
|
if (schedulerExecutor != null) { |
|
|
|
schedulerExecutor.shutdownNow(); |
|
|
|
} |
|
|
|
if (transportCallbackExecutor != null) { |
|
|
|
transportCallbackExecutor.shutdownNow(); |
|
|
|
} |
|
|
|
@ -231,11 +226,6 @@ public class DefaultTransportService implements TransportService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public ScheduledExecutorService getSchedulerExecutor() { |
|
|
|
return this.schedulerExecutor; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void registerAsyncSession(TransportProtos.SessionInfoProto sessionInfo, SessionMsgListener listener) { |
|
|
|
sessions.putIfAbsent(toSessionId(sessionInfo), new SessionMetaData(sessionInfo, TransportProtos.SessionType.ASYNC, listener)); |
|
|
|
@ -488,7 +478,7 @@ public class DefaultTransportService implements TransportService { |
|
|
|
sendToRuleEngine(tenantId, tbMsg, new TransportTbQueueCallback(callback)); |
|
|
|
String requestId = sessionId + "-" + msg.getRequestId(); |
|
|
|
toServerRpcPendingMap.put(requestId, new RpcRequestMetadata(sessionId, msg.getRequestId())); |
|
|
|
schedulerExecutor.schedule(() -> processTimeout(requestId), clientSideRpcTimeout, TimeUnit.MILLISECONDS); |
|
|
|
scheduler.schedule(() -> processTimeout(requestId), clientSideRpcTimeout, TimeUnit.MILLISECONDS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -561,7 +551,7 @@ public class DefaultTransportService implements TransportService { |
|
|
|
SessionMetaData currentSession = new SessionMetaData(sessionInfo, TransportProtos.SessionType.SYNC, listener); |
|
|
|
sessions.putIfAbsent(toSessionId(sessionInfo), currentSession); |
|
|
|
|
|
|
|
ScheduledFuture executorFuture = schedulerExecutor.schedule(() -> { |
|
|
|
ScheduledFuture executorFuture = scheduler.schedule(() -> { |
|
|
|
listener.onRemoteSessionCloseCommand(TransportProtos.SessionCloseNotificationProto.getDefaultInstance()); |
|
|
|
deregisterSession(sessionInfo); |
|
|
|
}, timeout, TimeUnit.MILLISECONDS); |
|
|
|
|