Refactoring for task processor queue factories
This commit is contained in:
parent
e59460b42b
commit
4c01b3d70a
@ -49,6 +49,7 @@ import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
@ -419,10 +420,11 @@ public class HashPartitionServiceTest {
|
||||
}
|
||||
|
||||
private HashPartitionService createPartitionService() {
|
||||
HashPartitionService partitionService = new HashPartitionService(serviceInfoProvider,
|
||||
routingInfoService,
|
||||
HashPartitionService partitionService = new HashPartitionService(
|
||||
applicationEventPublisher,
|
||||
queueRoutingInfoService,
|
||||
serviceInfoProvider,
|
||||
Optional.of(routingInfoService),
|
||||
Optional.of(queueRoutingInfoService),
|
||||
topicService);
|
||||
ReflectionTestUtils.setField(partitionService, "coreTopic", "tb.core");
|
||||
ReflectionTestUtils.setField(partitionService, "corePartitions", 10);
|
||||
|
||||
@ -66,13 +66,13 @@ public class DefaultTbServiceInfoProvider implements TbServiceInfoProvider {
|
||||
@Value("${service.rule_engine.assigned_tenant_profiles:}")
|
||||
private Set<UUID> assignedTenantProfiles;
|
||||
|
||||
@Autowired
|
||||
@Autowired(required = false)
|
||||
private EdqsConfig edqsConfig;
|
||||
|
||||
@Autowired
|
||||
private ApplicationContext applicationContext;
|
||||
|
||||
@Autowired
|
||||
@Autowired(required = false)
|
||||
private List<TaskProcessor<?, ?>> availableTaskProcessors;
|
||||
|
||||
private List<ServiceType> serviceTypes;
|
||||
@ -102,9 +102,13 @@ public class DefaultTbServiceInfoProvider implements TbServiceInfoProvider {
|
||||
edqsConfig.setLabel(serviceId);
|
||||
}
|
||||
}
|
||||
taskTypes = availableTaskProcessors.stream()
|
||||
.map(TaskProcessor::getJobType)
|
||||
.toList();
|
||||
if (CollectionsUtil.isNotEmpty(availableTaskProcessors)) {
|
||||
taskTypes = availableTaskProcessors.stream()
|
||||
.map(TaskProcessor::getJobType)
|
||||
.toList();
|
||||
} else {
|
||||
taskTypes = Collections.emptyList();
|
||||
}
|
||||
|
||||
generateNewServiceInfoWithCurrentSystemInfo();
|
||||
}
|
||||
@ -141,7 +145,9 @@ public class DefaultTbServiceInfoProvider implements TbServiceInfoProvider {
|
||||
if (CollectionsUtil.isNotEmpty(assignedTenantProfiles)) {
|
||||
builder.addAllAssignedTenantProfiles(assignedTenantProfiles.stream().map(UUID::toString).collect(Collectors.toList()));
|
||||
}
|
||||
builder.setLabel(edqsConfig.getLabel());
|
||||
if (edqsConfig != null) {
|
||||
builder.setLabel(edqsConfig.getLabel());
|
||||
}
|
||||
builder.addAllTaskTypes(taskTypes.stream().map(JobType::name).toList());
|
||||
return serviceInfo = builder.build();
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@ import com.google.common.hash.HashFunction;
|
||||
import com.google.common.hash.Hashing;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import lombok.Data;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@ -49,6 +50,7 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
@ -63,6 +65,7 @@ import static org.thingsboard.server.common.data.DataConstants.MAIN_QUEUE_NAME;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class HashPartitionService implements PartitionService {
|
||||
|
||||
@Value("${queue.core.topic:tb_core}")
|
||||
@ -90,8 +93,8 @@ public class HashPartitionService implements PartitionService {
|
||||
|
||||
private final ApplicationEventPublisher applicationEventPublisher;
|
||||
private final TbServiceInfoProvider serviceInfoProvider;
|
||||
private final TenantRoutingInfoService tenantRoutingInfoService;
|
||||
private final QueueRoutingInfoService queueRoutingInfoService;
|
||||
private final Optional<TenantRoutingInfoService> tenantRoutingInfoService;
|
||||
private final Optional<QueueRoutingInfoService> queueRoutingInfoService;
|
||||
private final TopicService topicService;
|
||||
|
||||
protected volatile ConcurrentMap<QueueKey, List<Integer>> myPartitions = new ConcurrentHashMap<>();
|
||||
@ -108,18 +111,6 @@ public class HashPartitionService implements PartitionService {
|
||||
|
||||
private HashFunction hashFunction;
|
||||
|
||||
public HashPartitionService(TbServiceInfoProvider serviceInfoProvider,
|
||||
TenantRoutingInfoService tenantRoutingInfoService,
|
||||
ApplicationEventPublisher applicationEventPublisher,
|
||||
QueueRoutingInfoService queueRoutingInfoService,
|
||||
TopicService topicService) {
|
||||
this.serviceInfoProvider = serviceInfoProvider;
|
||||
this.tenantRoutingInfoService = tenantRoutingInfoService;
|
||||
this.applicationEventPublisher = applicationEventPublisher;
|
||||
this.queueRoutingInfoService = queueRoutingInfoService;
|
||||
this.topicService = topicService;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
this.hashFunction = forName(hashFunctionName);
|
||||
@ -178,6 +169,10 @@ public class HashPartitionService implements PartitionService {
|
||||
}
|
||||
|
||||
private List<QueueRoutingInfo> getQueueRoutingInfos() {
|
||||
if (queueRoutingInfoService.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<QueueRoutingInfo> queueRoutingInfoList;
|
||||
String serviceType = serviceInfoProvider.getServiceType();
|
||||
|
||||
@ -188,7 +183,7 @@ public class HashPartitionService implements PartitionService {
|
||||
if (getQueuesRetries > 0) {
|
||||
log.info("Try to get queue routing info.");
|
||||
try {
|
||||
queueRoutingInfoList = queueRoutingInfoService.getAllQueuesRoutingInfo();
|
||||
queueRoutingInfoList = queueRoutingInfoService.get().getAllQueuesRoutingInfo();
|
||||
break;
|
||||
} catch (Exception e) {
|
||||
log.info("Failed to get queues routing info: {}!", e.getMessage());
|
||||
@ -204,7 +199,7 @@ public class HashPartitionService implements PartitionService {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
queueRoutingInfoList = queueRoutingInfoService.getAllQueuesRoutingInfo();
|
||||
queueRoutingInfoList = queueRoutingInfoService.get().getAllQueuesRoutingInfo();
|
||||
}
|
||||
return queueRoutingInfoList;
|
||||
}
|
||||
@ -638,7 +633,11 @@ public class HashPartitionService implements PartitionService {
|
||||
}
|
||||
|
||||
private TenantRoutingInfo getRoutingInfo(TenantId tenantId) {
|
||||
return tenantRoutingInfoMap.computeIfAbsent(tenantId, tenantRoutingInfoService::getRoutingInfo);
|
||||
if (tenantRoutingInfoService.isPresent()) {
|
||||
return tenantRoutingInfoMap.computeIfAbsent(tenantId, __ -> tenantRoutingInfoService.get().getRoutingInfo(tenantId));
|
||||
} else {
|
||||
return new TenantRoutingInfo(tenantId, null, false);
|
||||
}
|
||||
}
|
||||
|
||||
protected TenantId getIsolatedOrSystemTenantId(ServiceType serviceType, TenantId tenantId) {
|
||||
@ -702,7 +701,7 @@ public class HashPartitionService implements PartitionService {
|
||||
if (!responsibleServices.isEmpty()) { // if there are any dedicated servers
|
||||
TenantProfileId profileId;
|
||||
if (tenantId != null && !tenantId.isSysTenantId()) {
|
||||
TenantRoutingInfo routingInfo = tenantRoutingInfoService.getRoutingInfo(tenantId);
|
||||
TenantRoutingInfo routingInfo = tenantRoutingInfoService.get().getRoutingInfo(tenantId);
|
||||
profileId = routingInfo.getProfileId();
|
||||
} else {
|
||||
profileId = null;
|
||||
|
||||
@ -265,16 +265,6 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE
|
||||
return new InMemoryTbQueueProducer<>(storage, jobType.getTasksTopic());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<TransportProtos.TaskProto>> createTaskConsumer(JobType jobType) {
|
||||
return new InMemoryTbQueueConsumer<>(storage, jobType.getTasksTopic());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
|
||||
return new InMemoryTbQueueProducer<>(storage, "jobs.stats");
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() {
|
||||
return new InMemoryTbQueueConsumer<>(storage, "jobs.stats");
|
||||
|
||||
@ -656,29 +656,6 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<TaskProto>> createTaskConsumer(JobType jobType) {
|
||||
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<TaskProto>>builder()
|
||||
.settings(kafkaSettings)
|
||||
.topic(topicService.buildTopicName(jobType.getTasksTopic()))
|
||||
.clientId(jobType.name().toLowerCase() + "-task-consumer-" + serviceInfoProvider.getServiceId())
|
||||
.groupId(topicService.buildTopicName(jobType.name().toLowerCase() + "-task-consumer-group"))
|
||||
.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TaskProto.parseFrom(msg.getData()), msg.getHeaders()))
|
||||
.admin(tasksAdmin)
|
||||
.statsService(consumerStatsService)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
|
||||
return TbKafkaProducerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
|
||||
.clientId("job-stats-producer-" + serviceInfoProvider.getServiceId())
|
||||
.defaultTopic(topicService.buildTopicName("jobs.stats"))
|
||||
.settings(kafkaSettings)
|
||||
.admin(tasksAdmin)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() {
|
||||
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
|
||||
|
||||
@ -535,29 +535,6 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<TaskProto>> createTaskConsumer(JobType jobType) {
|
||||
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<TaskProto>>builder()
|
||||
.settings(kafkaSettings)
|
||||
.topic(topicService.buildTopicName(jobType.getTasksTopic()))
|
||||
.clientId(jobType.name().toLowerCase() + "-task-consumer-" + serviceInfoProvider.getServiceId())
|
||||
.groupId(topicService.buildTopicName(jobType.name().toLowerCase() + "-task-consumer-group"))
|
||||
.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TaskProto.parseFrom(msg.getData()), msg.getHeaders()))
|
||||
.admin(tasksAdmin)
|
||||
.statsService(consumerStatsService)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
|
||||
return TbKafkaProducerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
|
||||
.clientId("job-stats-producer-" + serviceInfoProvider.getServiceId())
|
||||
.defaultTopic(topicService.buildTopicName("jobs.stats"))
|
||||
.settings(kafkaSettings)
|
||||
.admin(tasksAdmin)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() {
|
||||
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
|
||||
|
||||
@ -22,15 +22,12 @@ import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.data.DataConstants;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.data.job.JobType;
|
||||
import org.thingsboard.server.common.data.queue.Queue;
|
||||
import org.thingsboard.server.common.msg.queue.ServiceType;
|
||||
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
|
||||
import org.thingsboard.server.gen.js.JsInvokeProtos;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.CalculatedFieldStateProto;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.FromEdqsMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.JobStatsMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.TaskProto;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldNotificationMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
|
||||
@ -99,7 +96,6 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
|
||||
private final TbQueueAdmin cfAdmin;
|
||||
private final TbQueueAdmin cfStateAdmin;
|
||||
private final TbQueueAdmin edqsEventsAdmin;
|
||||
private final TbQueueAdmin tasksAdmin;
|
||||
private final AtomicLong consumerCount = new AtomicLong();
|
||||
|
||||
public KafkaTbRuleEngineQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings,
|
||||
@ -137,7 +133,6 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
|
||||
this.cfAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCalculatedFieldConfigs());
|
||||
this.cfStateAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCalculatedFieldStateConfigs());
|
||||
this.edqsEventsAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getEdqsEventsConfigs());
|
||||
this.tasksAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getTasksConfigs());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -419,29 +414,6 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<TaskProto>> createTaskConsumer(JobType jobType) {
|
||||
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<TaskProto>>builder()
|
||||
.settings(kafkaSettings)
|
||||
.topic(topicService.buildTopicName(jobType.getTasksTopic()))
|
||||
.clientId(jobType.name().toLowerCase() + "-task-consumer-" + serviceInfoProvider.getServiceId())
|
||||
.groupId(topicService.buildTopicName(jobType.name().toLowerCase() + "-task-consumer-group"))
|
||||
.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TaskProto.parseFrom(msg.getData()), msg.getHeaders()))
|
||||
.admin(tasksAdmin)
|
||||
.statsService(consumerStatsService)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
|
||||
return TbKafkaProducerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
|
||||
.clientId("job-stats-producer-" + serviceInfoProvider.getServiceId())
|
||||
.defaultTopic(topicService.buildTopicName("jobs.stats"))
|
||||
.settings(kafkaSettings)
|
||||
.admin(tasksAdmin)
|
||||
.build();
|
||||
}
|
||||
|
||||
@PreDestroy
|
||||
private void destroy() {
|
||||
if (coreAdmin != null) {
|
||||
|
||||
@ -47,7 +47,7 @@ import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
* Responsible for initialization of various Producers and Consumers used by TB Core Node.
|
||||
* Implementation Depends on the queue queue.type from yml or TB_QUEUE_TYPE environment variable
|
||||
*/
|
||||
public interface TbCoreQueueFactory extends TbUsageStatsClientQueueFactory, HousekeeperClientQueueFactory, EdqsClientQueueFactory, TaskProcessorQueueFactory {
|
||||
public interface TbCoreQueueFactory extends TbUsageStatsClientQueueFactory, HousekeeperClientQueueFactory, EdqsClientQueueFactory {
|
||||
|
||||
/**
|
||||
* Used to push messages to instances of TB Transport Service
|
||||
|
||||
@ -18,7 +18,6 @@ package org.thingsboard.server.queue.provider;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.JobStatsMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldNotificationMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
|
||||
@ -54,7 +53,6 @@ public class TbCoreQueueProducerProvider implements TbQueueProducerProvider {
|
||||
private TbQueueProducer<TbProtoQueueMsg<ToHousekeeperServiceMsg>> toHousekeeper;
|
||||
private TbQueueProducer<TbProtoQueueMsg<ToCalculatedFieldMsg>> toCalculatedFields;
|
||||
private TbQueueProducer<TbProtoQueueMsg<ToCalculatedFieldNotificationMsg>> toCalculatedFieldNotifications;
|
||||
private TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> jobStatsProducer;
|
||||
|
||||
public TbCoreQueueProducerProvider(TbCoreQueueFactory tbQueueProvider) {
|
||||
this.tbQueueProvider = tbQueueProvider;
|
||||
@ -75,7 +73,6 @@ public class TbCoreQueueProducerProvider implements TbQueueProducerProvider {
|
||||
this.toEdgeEvents = tbQueueProvider.createEdgeEventMsgProducer();
|
||||
this.toCalculatedFields = tbQueueProvider.createToCalculatedFieldMsgProducer();
|
||||
this.toCalculatedFieldNotifications = tbQueueProvider.createToCalculatedFieldNotificationMsgProducer();
|
||||
this.jobStatsProducer = tbQueueProvider.createJobStatsProducer();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -143,9 +140,4 @@ public class TbCoreQueueProducerProvider implements TbQueueProducerProvider {
|
||||
return toCalculatedFieldNotifications;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> getJobStatsProducer() {
|
||||
return jobStatsProducer;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -15,7 +15,6 @@
|
||||
*/
|
||||
package org.thingsboard.server.queue.provider;
|
||||
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.JobStatsMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldNotificationMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
|
||||
@ -98,6 +97,4 @@ public interface TbQueueProducerProvider {
|
||||
|
||||
TbQueueProducer<TbProtoQueueMsg<ToCalculatedFieldNotificationMsg>> getCalculatedFieldsNotificationsMsgProducer();
|
||||
|
||||
TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> getJobStatsProducer();
|
||||
|
||||
}
|
||||
|
||||
@ -18,7 +18,6 @@ package org.thingsboard.server.queue.provider;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCalculatedFieldNotificationMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
|
||||
@ -52,7 +51,6 @@ public class TbRuleEngineProducerProvider implements TbQueueProducerProvider {
|
||||
private TbQueueProducer<TbProtoQueueMsg<ToEdgeEventNotificationMsg>> toEdgeEvents;
|
||||
private TbQueueProducer<TbProtoQueueMsg<ToCalculatedFieldMsg>> toCalculatedFields;
|
||||
private TbQueueProducer<TbProtoQueueMsg<ToCalculatedFieldNotificationMsg>> toCalculatedFieldNotifications;
|
||||
private TbQueueProducer<TbProtoQueueMsg<TransportProtos.JobStatsMsg>> jobStatsProducer;
|
||||
|
||||
public TbRuleEngineProducerProvider(TbRuleEngineQueueFactory tbQueueProvider) {
|
||||
this.tbQueueProvider = tbQueueProvider;
|
||||
@ -72,7 +70,6 @@ public class TbRuleEngineProducerProvider implements TbQueueProducerProvider {
|
||||
this.toEdgeEvents = tbQueueProvider.createEdgeEventMsgProducer();
|
||||
this.toCalculatedFields = tbQueueProvider.createToCalculatedFieldMsgProducer();
|
||||
this.toCalculatedFieldNotifications = tbQueueProvider.createToCalculatedFieldNotificationMsgProducer();
|
||||
this.jobStatsProducer = tbQueueProvider.createJobStatsProducer();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -140,9 +137,4 @@ public class TbRuleEngineProducerProvider implements TbQueueProducerProvider {
|
||||
return toCalculatedFieldNotifications;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<TransportProtos.JobStatsMsg>> getJobStatsProducer() {
|
||||
return jobStatsProducer;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -41,7 +41,7 @@ import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
* Responsible for initialization of various Producers and Consumers used by TB Core Node.
|
||||
* Implementation Depends on the queue queue.type from yml or TB_QUEUE_TYPE environment variable
|
||||
*/
|
||||
public interface TbRuleEngineQueueFactory extends TbUsageStatsClientQueueFactory, HousekeeperClientQueueFactory, EdqsClientQueueFactory, TaskProcessorQueueFactory {
|
||||
public interface TbRuleEngineQueueFactory extends TbUsageStatsClientQueueFactory, HousekeeperClientQueueFactory, EdqsClientQueueFactory {
|
||||
|
||||
/**
|
||||
* Used to push messages to instances of TB Transport Service
|
||||
|
||||
@ -122,9 +122,4 @@ public class TbTransportQueueProducerProvider implements TbQueueProducerProvider
|
||||
throw new RuntimeException("Not Implemented! Should not be used by Transport!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<TransportProtos.JobStatsMsg>> getJobStatsProducer() {
|
||||
throw new RuntimeException("Not Implemented! Should not be used by Transport!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -118,9 +118,4 @@ public class TbVersionControlProducerProvider implements TbQueueProducerProvider
|
||||
throw new RuntimeException("Not Implemented! Should not be used by Version Control Service!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<TransportProtos.JobStatsMsg>> getJobStatsProducer() {
|
||||
throw new RuntimeException("Not Implemented! Should not be used by Version Control Service!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
/**
|
||||
* Copyright © 2016-2025 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.queue.task;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.data.job.JobType;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.JobStatsMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.TaskProto;
|
||||
import org.thingsboard.server.queue.TbQueueConsumer;
|
||||
import org.thingsboard.server.queue.TbQueueProducer;
|
||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.queue.memory.InMemoryStorage;
|
||||
import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer;
|
||||
import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer;
|
||||
|
||||
@Component
|
||||
@ConditionalOnExpression("'${queue.type:null}'=='in-memory'")
|
||||
@RequiredArgsConstructor
|
||||
public class InMemoryTaskProcessorQueueFactory implements TaskProcessorQueueFactory {
|
||||
|
||||
private final InMemoryStorage storage;
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<TaskProto>> createTaskConsumer(JobType jobType) {
|
||||
return new InMemoryTbQueueConsumer<>(storage, jobType.getTasksTopic());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
|
||||
return new InMemoryTbQueueProducer<>(storage, "jobs.stats");
|
||||
}
|
||||
|
||||
}
|
||||
@ -15,7 +15,6 @@
|
||||
*/
|
||||
package org.thingsboard.server.queue.task;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -29,15 +28,17 @@ import org.thingsboard.server.gen.transport.TransportProtos.TaskResultProto;
|
||||
import org.thingsboard.server.queue.TbQueueCallback;
|
||||
import org.thingsboard.server.queue.TbQueueProducer;
|
||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
|
||||
|
||||
@Lazy
|
||||
@Service
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class JobStatsService {
|
||||
|
||||
private final TbQueueProducerProvider producerProvider;
|
||||
private final TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> producer;
|
||||
|
||||
public JobStatsService(TaskProcessorQueueFactory queueFactory) {
|
||||
this.producer = queueFactory.createJobStatsProducer();
|
||||
}
|
||||
|
||||
public void reportTaskResult(TenantId tenantId, JobId jobId, TaskResult result) {
|
||||
report(tenantId, jobId, JobStatsMsg.newBuilder()
|
||||
@ -59,7 +60,6 @@ public class JobStatsService {
|
||||
.setJobIdLSB(jobId.getId().getLeastSignificantBits());
|
||||
|
||||
TbProtoQueueMsg<JobStatsMsg> msg = new TbProtoQueueMsg<>(jobId.getId(), statsMsg.build());
|
||||
TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> producer = producerProvider.getJobStatsProducer();
|
||||
producer.send(TopicPartitionInfo.builder().topic(producer.getDefaultTopic()).build(), msg, TbQueueCallback.EMPTY);
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,82 @@
|
||||
/**
|
||||
* Copyright © 2016-2025 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.queue.task;
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.data.job.JobType;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.JobStatsMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.TaskProto;
|
||||
import org.thingsboard.server.queue.TbQueueAdmin;
|
||||
import org.thingsboard.server.queue.TbQueueConsumer;
|
||||
import org.thingsboard.server.queue.TbQueueProducer;
|
||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
||||
import org.thingsboard.server.queue.discovery.TopicService;
|
||||
import org.thingsboard.server.queue.kafka.TbKafkaAdmin;
|
||||
import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService;
|
||||
import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate;
|
||||
import org.thingsboard.server.queue.kafka.TbKafkaProducerTemplate;
|
||||
import org.thingsboard.server.queue.kafka.TbKafkaSettings;
|
||||
import org.thingsboard.server.queue.kafka.TbKafkaTopicConfigs;
|
||||
|
||||
@Component
|
||||
@ConditionalOnExpression("'${queue.type:null}'=='kafka'")
|
||||
public class KafkaTaskProcessorQueueFactory implements TaskProcessorQueueFactory {
|
||||
|
||||
private final TopicService topicService;
|
||||
private final TbServiceInfoProvider serviceInfoProvider;
|
||||
private final TbKafkaSettings kafkaSettings;
|
||||
private final TbKafkaConsumerStatsService consumerStatsService;
|
||||
|
||||
private final TbQueueAdmin tasksAdmin;
|
||||
|
||||
public KafkaTaskProcessorQueueFactory(TopicService topicService,
|
||||
TbServiceInfoProvider serviceInfoProvider,
|
||||
TbKafkaSettings kafkaSettings,
|
||||
TbKafkaConsumerStatsService consumerStatsService,
|
||||
TbKafkaTopicConfigs kafkaTopicConfigs) {
|
||||
this.serviceInfoProvider = serviceInfoProvider;
|
||||
this.kafkaSettings = kafkaSettings;
|
||||
this.topicService = topicService;
|
||||
this.consumerStatsService = consumerStatsService;
|
||||
this.tasksAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getTasksConfigs());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueConsumer<TbProtoQueueMsg<TaskProto>> createTaskConsumer(JobType jobType) {
|
||||
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<TaskProto>>builder()
|
||||
.settings(kafkaSettings)
|
||||
.topic(topicService.buildTopicName(jobType.getTasksTopic()))
|
||||
.clientId(jobType.name().toLowerCase() + "-task-consumer-" + serviceInfoProvider.getServiceId())
|
||||
.groupId(topicService.buildTopicName(jobType.name().toLowerCase() + "-task-consumer-group"))
|
||||
.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TaskProto.parseFrom(msg.getData()), msg.getHeaders()))
|
||||
.admin(tasksAdmin)
|
||||
.statsService(consumerStatsService)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
|
||||
return TbKafkaProducerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
|
||||
.clientId("job-stats-producer-" + serviceInfoProvider.getServiceId())
|
||||
.defaultTopic(topicService.buildTopicName("jobs.stats"))
|
||||
.settings(kafkaSettings)
|
||||
.admin(tasksAdmin)
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
@ -37,7 +37,6 @@ import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.queue.common.consumer.MainQueueConsumerManager;
|
||||
import org.thingsboard.server.queue.discovery.QueueKey;
|
||||
import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent;
|
||||
import org.thingsboard.server.queue.provider.TaskProcessorQueueFactory;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.queue.provider;
|
||||
package org.thingsboard.server.queue.task;
|
||||
|
||||
import org.thingsboard.server.common.data.job.JobType;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.JobStatsMsg;
|
||||
@ -1,33 +0,0 @@
|
||||
/**
|
||||
* Copyright © 2016-2025 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.edqs;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.queue.discovery.QueueRoutingInfo;
|
||||
import org.thingsboard.server.queue.discovery.QueueRoutingInfoService;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class DummyQueueRoutingInfoService implements QueueRoutingInfoService {
|
||||
|
||||
@Override
|
||||
public List<QueueRoutingInfo> getAllQueuesRoutingInfo() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,30 +0,0 @@
|
||||
/**
|
||||
* Copyright © 2016-2025 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.edqs;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.queue.discovery.TenantRoutingInfo;
|
||||
import org.thingsboard.server.queue.discovery.TenantRoutingInfoService;
|
||||
|
||||
@Service
|
||||
public class DummyTenantRoutingInfoService implements TenantRoutingInfoService {
|
||||
@Override
|
||||
public TenantRoutingInfo getRoutingInfo(TenantId tenantId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user