Refactoring for tasks api

This commit is contained in:
ViacheslavKlimov 2025-05-13 11:54:36 +03:00
parent faf4a2165f
commit 7d0b6bfdec
14 changed files with 67 additions and 22 deletions

View File

@ -1908,6 +1908,7 @@ queue:
# In a single-tenant environment, use 'entity' strategy to distribute the tasks among multiple partitions. # In a single-tenant environment, use 'entity' strategy to distribute the tasks among multiple partitions.
partitioning_strategy: "${TB_QUEUE_TASKS_PARTITIONING_STRATEGY:tenant}" partitioning_strategy: "${TB_QUEUE_TASKS_PARTITIONING_STRATEGY:tenant}"
stats: stats:
topic: "${TB_QUEUE_TASKS_STATS_TOPIC:jobs.stats}"
# Interval in milliseconds to process job stats # Interval in milliseconds to process job stats
processing_interval_ms: "${TB_QUEUE_TASKS_STATS_PROCESSING_INTERVAL_MS:1000}" processing_interval_ms: "${TB_QUEUE_TASKS_STATS_PROCESSING_INTERVAL_MS:1000}"

View File

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.queue; package org.thingsboard.server.queue;
public interface TbQueueCallback { public interface TbQueueCallback {
TbQueueCallback EMPTY = new TbQueueCallback() { TbQueueCallback EMPTY = new TbQueueCallback() {
@ -34,4 +33,5 @@ public interface TbQueueCallback {
void onSuccess(TbQueueMsgMetadata metadata); void onSuccess(TbQueueMsgMetadata metadata);
void onFailure(Throwable t); void onFailure(Throwable t);
} }

View File

@ -43,6 +43,7 @@ import org.thingsboard.server.queue.edqs.EdqsConfig;
import org.thingsboard.server.queue.memory.InMemoryStorage; import org.thingsboard.server.queue.memory.InMemoryStorage;
import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer;
import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer; import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer;
import org.thingsboard.server.queue.settings.TasksQueueConfig;
import org.thingsboard.server.queue.settings.TbQueueCalculatedFieldSettings; import org.thingsboard.server.queue.settings.TbQueueCalculatedFieldSettings;
import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
import org.thingsboard.server.queue.settings.TbQueueEdgeSettings; import org.thingsboard.server.queue.settings.TbQueueEdgeSettings;
@ -68,6 +69,7 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE
private final TbQueueEdgeSettings edgeSettings; private final TbQueueEdgeSettings edgeSettings;
private final TbQueueCalculatedFieldSettings calculatedFieldSettings; private final TbQueueCalculatedFieldSettings calculatedFieldSettings;
private final EdqsConfig edqsConfig; private final EdqsConfig edqsConfig;
private final TasksQueueConfig tasksQueueConfig;
private final InMemoryStorage storage; private final InMemoryStorage storage;
@Override @Override
@ -267,7 +269,7 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE
@Override @Override
public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() { public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() {
return new InMemoryTbQueueConsumer<>(storage, "jobs.stats"); return new InMemoryTbQueueConsumer<>(storage, tasksQueueConfig.getStatsTopic());
} }
@Scheduled(fixedRateString = "${queue.in_memory.stats.print-interval-ms:60000}") @Scheduled(fixedRateString = "${queue.in_memory.stats.print-interval-ms:60000}")

View File

@ -66,6 +66,7 @@ import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate;
import org.thingsboard.server.queue.kafka.TbKafkaProducerTemplate; import org.thingsboard.server.queue.kafka.TbKafkaProducerTemplate;
import org.thingsboard.server.queue.kafka.TbKafkaSettings; import org.thingsboard.server.queue.kafka.TbKafkaSettings;
import org.thingsboard.server.queue.kafka.TbKafkaTopicConfigs; import org.thingsboard.server.queue.kafka.TbKafkaTopicConfigs;
import org.thingsboard.server.queue.settings.TasksQueueConfig;
import org.thingsboard.server.queue.settings.TbQueueCalculatedFieldSettings; import org.thingsboard.server.queue.settings.TbQueueCalculatedFieldSettings;
import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
import org.thingsboard.server.queue.settings.TbQueueEdgeSettings; import org.thingsboard.server.queue.settings.TbQueueEdgeSettings;
@ -95,6 +96,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
private final TbQueueCalculatedFieldSettings calculatedFieldSettings; private final TbQueueCalculatedFieldSettings calculatedFieldSettings;
private final TbKafkaConsumerStatsService consumerStatsService; private final TbKafkaConsumerStatsService consumerStatsService;
private final EdqsConfig edqsConfig; private final EdqsConfig edqsConfig;
private final TasksQueueConfig tasksQueueConfig;
private final TbQueueAdmin coreAdmin; private final TbQueueAdmin coreAdmin;
private final TbKafkaAdmin ruleEngineAdmin; private final TbKafkaAdmin ruleEngineAdmin;
@ -130,7 +132,8 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
TbQueueCalculatedFieldSettings calculatedFieldSettings, TbQueueCalculatedFieldSettings calculatedFieldSettings,
TbKafkaConsumerStatsService consumerStatsService, TbKafkaConsumerStatsService consumerStatsService,
TbKafkaTopicConfigs kafkaTopicConfigs, TbKafkaTopicConfigs kafkaTopicConfigs,
EdqsConfig edqsConfig) { EdqsConfig edqsConfig,
TasksQueueConfig tasksQueueConfig) {
this.topicService = topicService; this.topicService = topicService;
this.kafkaSettings = kafkaSettings; this.kafkaSettings = kafkaSettings;
this.serviceInfoProvider = serviceInfoProvider; this.serviceInfoProvider = serviceInfoProvider;
@ -144,6 +147,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
this.edgeSettings = edgeSettings; this.edgeSettings = edgeSettings;
this.calculatedFieldSettings = calculatedFieldSettings; this.calculatedFieldSettings = calculatedFieldSettings;
this.edqsConfig = edqsConfig; this.edqsConfig = edqsConfig;
this.tasksQueueConfig = tasksQueueConfig;
this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs()); this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs());
this.ruleEngineAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getRuleEngineConfigs()); this.ruleEngineAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getRuleEngineConfigs());
@ -660,7 +664,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() { public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() {
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder() return TbKafkaConsumerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
.settings(kafkaSettings) .settings(kafkaSettings)
.topic(topicService.buildTopicName("jobs.stats")) .topic(topicService.buildTopicName(tasksQueueConfig.getStatsTopic()))
.clientId("job-stats-consumer-" + serviceInfoProvider.getServiceId()) .clientId("job-stats-consumer-" + serviceInfoProvider.getServiceId())
.groupId(topicService.buildTopicName("job-stats-consumer-group")) .groupId(topicService.buildTopicName("job-stats-consumer-group"))
.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), JobStatsMsg.parseFrom(msg.getData()), msg.getHeaders())) .decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), JobStatsMsg.parseFrom(msg.getData()), msg.getHeaders()))

View File

@ -62,6 +62,7 @@ import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate;
import org.thingsboard.server.queue.kafka.TbKafkaProducerTemplate; import org.thingsboard.server.queue.kafka.TbKafkaProducerTemplate;
import org.thingsboard.server.queue.kafka.TbKafkaSettings; import org.thingsboard.server.queue.kafka.TbKafkaSettings;
import org.thingsboard.server.queue.kafka.TbKafkaTopicConfigs; import org.thingsboard.server.queue.kafka.TbKafkaTopicConfigs;
import org.thingsboard.server.queue.settings.TasksQueueConfig;
import org.thingsboard.server.queue.settings.TbQueueCalculatedFieldSettings; import org.thingsboard.server.queue.settings.TbQueueCalculatedFieldSettings;
import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
import org.thingsboard.server.queue.settings.TbQueueEdgeSettings; import org.thingsboard.server.queue.settings.TbQueueEdgeSettings;
@ -91,6 +92,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
private final TbQueueEdgeSettings edgeSettings; private final TbQueueEdgeSettings edgeSettings;
private final TbQueueCalculatedFieldSettings calculatedFieldSettings; private final TbQueueCalculatedFieldSettings calculatedFieldSettings;
private final EdqsConfig edqsConfig; private final EdqsConfig edqsConfig;
private final TasksQueueConfig tasksQueueConfig;
private final TbQueueAdmin coreAdmin; private final TbQueueAdmin coreAdmin;
private final TbQueueAdmin ruleEngineAdmin; private final TbQueueAdmin ruleEngineAdmin;
@ -126,6 +128,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
TbQueueTransportNotificationSettings transportNotificationSettings, TbQueueTransportNotificationSettings transportNotificationSettings,
TbQueueCalculatedFieldSettings calculatedFieldSettings, TbQueueCalculatedFieldSettings calculatedFieldSettings,
EdqsConfig edqsConfig, EdqsConfig edqsConfig,
TasksQueueConfig tasksQueueConfig,
TbKafkaTopicConfigs kafkaTopicConfigs) { TbKafkaTopicConfigs kafkaTopicConfigs) {
this.topicService = topicService; this.topicService = topicService;
this.kafkaSettings = kafkaSettings; this.kafkaSettings = kafkaSettings;
@ -140,6 +143,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
this.edgeSettings = edgeSettings; this.edgeSettings = edgeSettings;
this.calculatedFieldSettings = calculatedFieldSettings; this.calculatedFieldSettings = calculatedFieldSettings;
this.edqsConfig = edqsConfig; this.edqsConfig = edqsConfig;
this.tasksQueueConfig = tasksQueueConfig;
this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs()); this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs());
this.ruleEngineAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getRuleEngineConfigs()); this.ruleEngineAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getRuleEngineConfigs());
@ -539,7 +543,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() { public TbQueueConsumer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsConsumer() {
return TbKafkaConsumerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder() return TbKafkaConsumerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
.settings(kafkaSettings) .settings(kafkaSettings)
.topic(topicService.buildTopicName("jobs.stats")) .topic(topicService.buildTopicName(tasksQueueConfig.getStatsTopic()))
.clientId("job-stats-consumer-" + serviceInfoProvider.getServiceId()) .clientId("job-stats-consumer-" + serviceInfoProvider.getServiceId())
.groupId(topicService.buildTopicName("job-stats-consumer-group")) .groupId(topicService.buildTopicName("job-stats-consumer-group"))
.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), JobStatsMsg.parseFrom(msg.getData()), msg.getHeaders())) .decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), JobStatsMsg.parseFrom(msg.getData()), msg.getHeaders()))

View File

@ -0,0 +1,32 @@
/**
* 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.settings;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Data
@Component
public class TasksQueueConfig {
@Value("${queue.tasks.poll_interval}")
private int pollInterval;
@Value("${queue.tasks.stats.topic}")
private String statsTopic;
}

View File

@ -27,6 +27,7 @@ import org.thingsboard.server.queue.common.TbProtoQueueMsg;
import org.thingsboard.server.queue.memory.InMemoryStorage; import org.thingsboard.server.queue.memory.InMemoryStorage;
import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer;
import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer; import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer;
import org.thingsboard.server.queue.settings.TasksQueueConfig;
@Component @Component
@ConditionalOnExpression("'${queue.type:null}'=='in-memory'") @ConditionalOnExpression("'${queue.type:null}'=='in-memory'")
@ -34,6 +35,7 @@ import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer;
public class InMemoryTaskProcessorQueueFactory implements TaskProcessorQueueFactory { public class InMemoryTaskProcessorQueueFactory implements TaskProcessorQueueFactory {
private final InMemoryStorage storage; private final InMemoryStorage storage;
private final TasksQueueConfig tasksQueueConfig;
@Override @Override
public TbQueueConsumer<TbProtoQueueMsg<TaskProto>> createTaskConsumer(JobType jobType) { public TbQueueConsumer<TbProtoQueueMsg<TaskProto>> createTaskConsumer(JobType jobType) {
@ -42,7 +44,7 @@ public class InMemoryTaskProcessorQueueFactory implements TaskProcessorQueueFact
@Override @Override
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() { public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
return new InMemoryTbQueueProducer<>(storage, "jobs.stats"); return new InMemoryTbQueueProducer<>(storage, tasksQueueConfig.getStatsTopic());
} }
} }

View File

@ -32,6 +32,7 @@ import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate;
import org.thingsboard.server.queue.kafka.TbKafkaProducerTemplate; import org.thingsboard.server.queue.kafka.TbKafkaProducerTemplate;
import org.thingsboard.server.queue.kafka.TbKafkaSettings; import org.thingsboard.server.queue.kafka.TbKafkaSettings;
import org.thingsboard.server.queue.kafka.TbKafkaTopicConfigs; import org.thingsboard.server.queue.kafka.TbKafkaTopicConfigs;
import org.thingsboard.server.queue.settings.TasksQueueConfig;
@Component @Component
@ConditionalOnExpression("'${queue.type:null}'=='kafka'") @ConditionalOnExpression("'${queue.type:null}'=='kafka'")
@ -39,6 +40,7 @@ public class KafkaTaskProcessorQueueFactory implements TaskProcessorQueueFactory
private final TopicService topicService; private final TopicService topicService;
private final TbServiceInfoProvider serviceInfoProvider; private final TbServiceInfoProvider serviceInfoProvider;
private final TasksQueueConfig tasksQueueConfig;
private final TbKafkaSettings kafkaSettings; private final TbKafkaSettings kafkaSettings;
private final TbKafkaConsumerStatsService consumerStatsService; private final TbKafkaConsumerStatsService consumerStatsService;
@ -46,12 +48,14 @@ public class KafkaTaskProcessorQueueFactory implements TaskProcessorQueueFactory
public KafkaTaskProcessorQueueFactory(TopicService topicService, public KafkaTaskProcessorQueueFactory(TopicService topicService,
TbServiceInfoProvider serviceInfoProvider, TbServiceInfoProvider serviceInfoProvider,
TasksQueueConfig tasksQueueConfig,
TbKafkaSettings kafkaSettings, TbKafkaSettings kafkaSettings,
TbKafkaConsumerStatsService consumerStatsService, TbKafkaConsumerStatsService consumerStatsService,
TbKafkaTopicConfigs kafkaTopicConfigs) { TbKafkaTopicConfigs kafkaTopicConfigs) {
this.serviceInfoProvider = serviceInfoProvider;
this.kafkaSettings = kafkaSettings;
this.topicService = topicService; this.topicService = topicService;
this.serviceInfoProvider = serviceInfoProvider;
this.tasksQueueConfig = tasksQueueConfig;
this.kafkaSettings = kafkaSettings;
this.consumerStatsService = consumerStatsService; this.consumerStatsService = consumerStatsService;
this.tasksAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getTasksConfigs()); this.tasksAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getTasksConfigs());
} }
@ -73,7 +77,7 @@ public class KafkaTaskProcessorQueueFactory implements TaskProcessorQueueFactory
public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() { public TbQueueProducer<TbProtoQueueMsg<JobStatsMsg>> createJobStatsProducer() {
return TbKafkaProducerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder() return TbKafkaProducerTemplate.<TbProtoQueueMsg<JobStatsMsg>>builder()
.clientId("job-stats-producer-" + serviceInfoProvider.getServiceId()) .clientId("job-stats-producer-" + serviceInfoProvider.getServiceId())
.defaultTopic(topicService.buildTopicName("jobs.stats")) .defaultTopic(topicService.buildTopicName(tasksQueueConfig.getStatsTopic()))
.settings(kafkaSettings) .settings(kafkaSettings)
.admin(tasksAdmin) .admin(tasksAdmin)
.build(); .build();

View File

@ -20,7 +20,6 @@ import jakarta.annotation.PreDestroy;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.SetCache; import org.thingsboard.common.util.SetCache;
@ -40,6 +39,7 @@ import org.thingsboard.server.queue.common.TbProtoQueueMsg;
import org.thingsboard.server.queue.common.consumer.MainQueueConsumerManager; import org.thingsboard.server.queue.common.consumer.MainQueueConsumerManager;
import org.thingsboard.server.queue.discovery.QueueKey; import org.thingsboard.server.queue.discovery.QueueKey;
import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent;
import org.thingsboard.server.queue.settings.TasksQueueConfig;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -61,9 +61,8 @@ public abstract class TaskProcessor<T extends Task<R>, R extends TaskResult> {
private JobStatsService statsService; private JobStatsService statsService;
@Autowired @Autowired
private TaskProcessorExecutors executors; private TaskProcessorExecutors executors;
@Autowired
@Value("${queue.tasks.poll_interval:500}") private TasksQueueConfig config;
private int pollInterval;
private QueueKey queueKey; private QueueKey queueKey;
private MainQueueConsumerManager<TbProtoQueueMsg<TaskProto>, QueueConfig> taskConsumer; private MainQueueConsumerManager<TbProtoQueueMsg<TaskProto>, QueueConfig> taskConsumer;
@ -77,7 +76,7 @@ public abstract class TaskProcessor<T extends Task<R>, R extends TaskResult> {
queueKey = new QueueKey(ServiceType.TASK_PROCESSOR, getJobType().name()); queueKey = new QueueKey(ServiceType.TASK_PROCESSOR, getJobType().name());
taskConsumer = MainQueueConsumerManager.<TbProtoQueueMsg<TaskProto>, QueueConfig>builder() taskConsumer = MainQueueConsumerManager.<TbProtoQueueMsg<TaskProto>, QueueConfig>builder()
.queueKey(queueKey) .queueKey(queueKey)
.config(QueueConfig.of(true, pollInterval)) .config(QueueConfig.of(true, config.getPollInterval()))
.msgPackProcessor(this::processMsgs) .msgPackProcessor(this::processMsgs)
.consumerCreator((queueConfig, tpi) -> queueFactory.createTaskConsumer(getJobType())) .consumerCreator((queueConfig, tpi) -> queueFactory.createTaskConsumer(getJobType()))
.consumerExecutor(executors.getConsumersExecutor()) .consumerExecutor(executors.getConsumersExecutor())

View File

@ -181,7 +181,7 @@ public class DefaultJobService extends AbstractEntityService implements JobServi
@Override @Override
public Job findLatestJobByKey(TenantId tenantId, String key) { public Job findLatestJobByKey(TenantId tenantId, String key) {
return jobDao.findLatestByKey(tenantId, key); return jobDao.findLatestByTenantIdAndKey(tenantId, key);
} }
private Job findForUpdate(TenantId tenantId, JobId jobId) { private Job findForUpdate(TenantId tenantId, JobId jobId) {

View File

@ -31,7 +31,7 @@ public interface JobDao extends Dao<Job> {
Job findByIdForUpdate(TenantId tenantId, JobId jobId); Job findByIdForUpdate(TenantId tenantId, JobId jobId);
Job findLatestByKey(TenantId tenantId, String key); Job findLatestByTenantIdAndKey(TenantId tenantId, String key);
boolean existsByTenantAndKeyAndStatusOneOf(TenantId tenantId, String key, JobStatus... statuses); boolean existsByTenantAndKeyAndStatusOneOf(TenantId tenantId, String key, JobStatus... statuses);

View File

@ -25,8 +25,6 @@ import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.JdbcType;
import org.hibernate.dialect.PostgreSQLJsonPGObjectJsonbType;
import org.thingsboard.server.common.data.id.JobId; import org.thingsboard.server.common.data.id.JobId;
import org.thingsboard.server.common.data.job.Job; import org.thingsboard.server.common.data.job.Job;
import org.thingsboard.server.common.data.job.JobConfiguration; import org.thingsboard.server.common.data.job.JobConfiguration;
@ -68,7 +66,6 @@ public class JobEntity extends BaseSqlEntity<Job> {
private JsonNode configuration; private JsonNode configuration;
@Convert(converter = JsonConverter.class) @Convert(converter = JsonConverter.class)
@JdbcType(PostgreSQLJsonPGObjectJsonbType.class)
@Column(name = ModelConstants.JOB_RESULT_PROPERTY) @Column(name = ModelConstants.JOB_RESULT_PROPERTY)
private JsonNode result; private JsonNode result;

View File

@ -59,7 +59,7 @@ public class JpaJobDao extends JpaAbstractDao<JobEntity, Job> implements JobDao
} }
@Override @Override
public Job findLatestByKey(TenantId tenantId, String key) { public Job findLatestByTenantIdAndKey(TenantId tenantId, String key) {
return DaoUtil.getData(jobRepository.findLatestByTenantIdAndKey(tenantId.getId(), key)); return DaoUtil.getData(jobRepository.findLatestByTenantIdAndKey(tenantId.getId(), key));
} }

View File

@ -957,6 +957,6 @@ CREATE TABLE IF NOT EXISTS job (
key varchar NOT NULL, key varchar NOT NULL,
description varchar NOT NULL, description varchar NOT NULL,
status varchar NOT NULL, status varchar NOT NULL,
configuration varchar(1000000) NOT NULL, configuration varchar NOT NULL,
result jsonb result varchar
); );