diff --git a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java index 26c82a33de..b2845085fd 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java @@ -95,6 +95,7 @@ import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.rule.RuleNodeStateService; +import org.thingsboard.server.dao.job.JobService; import org.thingsboard.server.dao.tenant.TbTenantProfileCache; import org.thingsboard.server.dao.tenant.TenantProfileService; import org.thingsboard.server.dao.tenant.TenantService; @@ -551,6 +552,11 @@ public class ActorSystemContext { @Getter private CalculatedFieldQueueService calculatedFieldQueueService; + @Lazy + @Autowired(required = false) + @Getter + private JobService jobService; + @Value("${actors.session.max_concurrent_sessions_per_device:1}") @Getter private int maxConcurrentSessionsPerDevice; diff --git a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java index 033e10ca9a..e40453da25 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java @@ -23,6 +23,7 @@ import org.bouncycastle.util.Arrays; import org.thingsboard.common.util.DebugModeUtil; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.ListeningExecutor; +import org.thingsboard.rule.engine.api.DeviceStateManager; import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.rule.engine.api.NotificationCenter; import org.thingsboard.rule.engine.api.RuleEngineAlarmService; @@ -30,7 +31,6 @@ import org.thingsboard.rule.engine.api.RuleEngineApiUsageStateService; import org.thingsboard.rule.engine.api.RuleEngineAssetProfileCache; import org.thingsboard.rule.engine.api.RuleEngineCalculatedFieldQueueService; import org.thingsboard.rule.engine.api.RuleEngineDeviceProfileCache; -import org.thingsboard.rule.engine.api.DeviceStateManager; import org.thingsboard.rule.engine.api.RuleEngineRpcService; import org.thingsboard.rule.engine.api.RuleEngineTelemetryService; import org.thingsboard.rule.engine.api.ScriptEngine; @@ -107,6 +107,7 @@ import org.thingsboard.server.dao.queue.QueueStatsService; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.job.JobService; import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.dao.user.UserService; @@ -887,6 +888,11 @@ public class DefaultTbContext implements TbContext { return mainCtx.getCalculatedFieldQueueService(); } + @Override + public JobService getJobService() { + return mainCtx.getJobService(); + } + @Override public boolean isExternalNodeForceAck() { return mainCtx.isExternalNodeForceAck(); diff --git a/application/src/main/java/org/thingsboard/server/service/job/CfReprocessingJobProcessor.java b/application/src/main/java/org/thingsboard/server/service/job/CfReprocessingJobProcessor.java deleted file mode 100644 index 79a735f6a6..0000000000 --- a/application/src/main/java/org/thingsboard/server/service/job/CfReprocessingJobProcessor.java +++ /dev/null @@ -1,105 +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.service.job; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.cf.CalculatedField; -import org.thingsboard.server.common.data.id.AssetProfileId; -import org.thingsboard.server.common.data.id.DeviceProfileId; -import org.thingsboard.server.common.data.id.EntityId; -import org.thingsboard.server.common.data.job.CfReprocessingJobConfiguration; -import org.thingsboard.server.common.data.job.CfReprocessingTask; -import org.thingsboard.server.common.data.job.CfReprocessingTask.CfReprocessingTaskFailure; -import org.thingsboard.server.common.data.job.Job; -import org.thingsboard.server.common.data.job.JobType; -import org.thingsboard.server.common.data.job.Task; -import org.thingsboard.server.common.data.job.TaskFailure; -import org.thingsboard.server.common.data.page.PageDataIterable; -import org.thingsboard.server.dao.asset.AssetService; -import org.thingsboard.server.dao.cf.CalculatedFieldService; -import org.thingsboard.server.dao.device.DeviceService; - -import java.util.List; -import java.util.function.Consumer; - -@Component -@RequiredArgsConstructor -public class CfReprocessingJobProcessor implements JobProcessor { - - private final CalculatedFieldService calculatedFieldService; - private final DeviceService deviceService; - private final AssetService assetService; - - @Override - public int process(Job job, Consumer taskConsumer) throws Exception { - CfReprocessingJobConfiguration configuration = job.getConfiguration(); - - CalculatedField calculatedField = calculatedFieldService.findById(job.getTenantId(), configuration.getCalculatedFieldId()); - EntityId cfEntityId = calculatedField.getEntityId(); - - int tasksCount = 0; - if (cfEntityId.getEntityType().isOneOf(EntityType.DEVICE, EntityType.ASSET)) { - taskConsumer.accept(createTask(job, configuration, calculatedField, cfEntityId)); - tasksCount++; - } else { - PageDataIterable entities; - if (cfEntityId.getEntityType() == EntityType.DEVICE_PROFILE) { - entities = new PageDataIterable<>(pageLink -> deviceService.findDeviceIdsByTenantIdAndDeviceProfileId(job.getTenantId(), (DeviceProfileId) cfEntityId, pageLink), 512); - } else if (cfEntityId.getEntityType() == EntityType.ASSET_PROFILE) { - entities = new PageDataIterable<>(pageLink -> assetService.findAssetIdsByTenantIdAndAssetProfileId(job.getTenantId(), (AssetProfileId) cfEntityId, pageLink), 512); - } else { - throw new IllegalArgumentException("Unsupported CF entity type " + cfEntityId.getEntityType()); - } - for (EntityId entityId : entities) { - taskConsumer.accept(createTask(job, configuration, calculatedField, entityId)); - tasksCount++; - } - } - return tasksCount; - } - - @Override - public void reprocess(Job job, List failures, Consumer taskConsumer) throws Exception { - CfReprocessingJobConfiguration configuration = job.getConfiguration(); - CalculatedField calculatedField = calculatedFieldService.findById(job.getTenantId(), configuration.getCalculatedFieldId()); - - for (TaskFailure failure : failures) { - CfReprocessingTaskFailure taskFailure = (CfReprocessingTaskFailure) failure; - EntityId entityId = taskFailure.getEntityId(); - taskConsumer.accept(createTask(job, job.getConfiguration(), calculatedField, entityId)); - } - } - - private Task createTask(Job job, CfReprocessingJobConfiguration configuration, CalculatedField calculatedField, EntityId entityId) { - return CfReprocessingTask.builder() - .tenantId(job.getTenantId()) - .jobId(job.getId()) - .retries(2) // 3 attempts in total - .calculatedField(calculatedField) - .entityId(entityId) - .startTs(configuration.getStartTs()) - .endTs(configuration.getEndTs()) - .build(); - } - - @Override - public JobType getType() { - return JobType.CF_REPROCESSING; - } - -} diff --git a/application/src/main/java/org/thingsboard/server/service/job/task/CfReprocessingTaskProcessor.java b/application/src/main/java/org/thingsboard/server/service/job/task/CfReprocessingTaskProcessor.java deleted file mode 100644 index 5d4005307c..0000000000 --- a/application/src/main/java/org/thingsboard/server/service/job/task/CfReprocessingTaskProcessor.java +++ /dev/null @@ -1,57 +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.service.job.task; - -import com.google.common.util.concurrent.SettableFuture; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import org.thingsboard.server.actors.calculatedField.CalculatedFieldReprocessingService; -import org.thingsboard.server.common.data.job.CfReprocessingTask; -import org.thingsboard.server.common.data.job.JobType; -import org.thingsboard.server.common.msg.queue.TbCallback; -import org.thingsboard.server.queue.task.TaskProcessor; - -import java.util.concurrent.TimeUnit; - -@Component -@RequiredArgsConstructor -public class CfReprocessingTaskProcessor extends TaskProcessor { - - private final CalculatedFieldReprocessingService cfReprocessingService; - - @Override - public void process(CfReprocessingTask task) throws Exception { - SettableFuture future = SettableFuture.create(); - cfReprocessingService.reprocess(task, new TbCallback() { - @Override - public void onSuccess() { - future.set(null); - } - - @Override - public void onFailure(Throwable t) { - future.setException(t); - } - }); - future.get(1, TimeUnit.MINUTES); - } - - @Override - public JobType getJobType() { - return JobType.CF_REPROCESSING; - } - -} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobConfiguration.java deleted file mode 100644 index 90de047554..0000000000 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobConfiguration.java +++ /dev/null @@ -1,43 +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.common.data.job; - -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.thingsboard.server.common.data.id.CalculatedFieldId; - -@Data -@EqualsAndHashCode(callSuper = true) -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class CfReprocessingJobConfiguration extends JobConfiguration { - - @NotNull - private CalculatedFieldId calculatedFieldId; - private long startTs; - private long endTs; - - @Override - public JobType getType() { - return JobType.CF_REPROCESSING; - } - -} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobResult.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobResult.java deleted file mode 100644 index 2d756f6d53..0000000000 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobResult.java +++ /dev/null @@ -1,25 +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.common.data.job; - -public class CfReprocessingJobResult extends JobResult { - - @Override - public JobType getJobType() { - return JobType.CF_REPROCESSING; - } - -} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingTask.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingTask.java deleted file mode 100644 index 3c8b765527..0000000000 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingTask.java +++ /dev/null @@ -1,72 +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.common.data.job; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.ToString; -import lombok.experimental.SuperBuilder; -import org.thingsboard.server.common.data.cf.CalculatedField; -import org.thingsboard.server.common.data.id.EntityId; - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@SuperBuilder -@ToString(callSuper = true) -public class CfReprocessingTask extends Task { - - private CalculatedField calculatedField; - private EntityId entityId; - private long startTs; - private long endTs; - - @Override - public Object getKey() { - return entityId; - } - - @Override - public TaskFailure toFailure(Throwable error) { - return new CfReprocessingTaskFailure(entityId, error.getMessage()); - } - - @Override - public JobType getJobType() { - return JobType.CF_REPROCESSING; - } - - @Data - @EqualsAndHashCode(callSuper = true) - @NoArgsConstructor - public static class CfReprocessingTaskFailure extends TaskFailure { - - private EntityId entityId; - - public CfReprocessingTaskFailure(EntityId entityId, String error) { - super(error); - this.entityId = entityId; - } - - @Override - public JobType getJobType() { - return JobType.CF_REPROCESSING; - } - - } - -} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/Job.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/Job.java index e96d42cad1..237c223a92 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/Job.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/job/Job.java @@ -54,7 +54,6 @@ public class Job extends BaseData implements HasTenantId { this.description = description; this.configuration = configuration; this.result = switch (type) { - case CF_REPROCESSING -> new CfReprocessingJobResult(); case DUMMY -> new DummyJobResult(); }; } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/JobConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/JobConfiguration.java index 0d3620d9e8..7a2eccd42a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/JobConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/job/JobConfiguration.java @@ -27,7 +27,6 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") @JsonSubTypes({ - @Type(name = "CF_REPROCESSING", value = CfReprocessingJobConfiguration.class), @Type(name = "DUMMY", value = DummyJobConfiguration.class), }) @Data diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/JobResult.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/JobResult.java index 748d24811c..bf5e5f2c56 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/JobResult.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/job/JobResult.java @@ -30,7 +30,6 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType") @JsonSubTypes({ - @Type(name = "CF_REPROCESSING", value = CfReprocessingJobResult.class), @Type(name = "DUMMY", value = DummyJobResult.class) }) @Data diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/JobType.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/JobType.java index 7c0d9972e1..9e8e9fa7e5 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/JobType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/job/JobType.java @@ -17,7 +17,6 @@ package org.thingsboard.server.common.data.job; public enum JobType { - CF_REPROCESSING, DUMMY; public String getTasksTopic() { diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/Task.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/Task.java index 6399f6f79a..ad7c6b62df 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/Task.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/job/Task.java @@ -30,7 +30,6 @@ import org.thingsboard.server.common.data.id.TenantId; @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType") @JsonSubTypes({ - @Type(name = "CF_REPROCESSING", value = CfReprocessingTask.class), @Type(name = "DUMMY", value = DummyTask.class) }) @SuperBuilder diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/job/TaskFailure.java b/common/data/src/main/java/org/thingsboard/server/common/data/job/TaskFailure.java index 1e365c6a8f..7a04db8188 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/job/TaskFailure.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/job/TaskFailure.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.thingsboard.server.common.data.job.CfReprocessingTask.CfReprocessingTaskFailure; import org.thingsboard.server.common.data.job.DummyTask.DummyTaskFailure; @Data @@ -31,7 +30,6 @@ import org.thingsboard.server.common.data.job.DummyTask.DummyTaskFailure; @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType") @JsonSubTypes({ - @Type(name = "CF_REPROCESSING", value = CfReprocessingTaskFailure.class), @Type(name = "DUMMY", value = DummyTaskFailure.class) }) public abstract class TaskFailure { diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index 5afc9398d2..ba43a54697 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -957,6 +957,6 @@ CREATE TABLE IF NOT EXISTS job ( key varchar NOT NULL, description varchar NOT NULL, status varchar NOT NULL, - configuration varchar(1000) NOT NULL, + configuration varchar(1000000) NOT NULL, result jsonb ); diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java index b66c9e13d5..d4d19dd653 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java +++ b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java @@ -77,6 +77,7 @@ import org.thingsboard.server.dao.queue.QueueStatsService; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.job.JobService; import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.dao.user.UserService; @@ -362,6 +363,8 @@ public interface TbContext { RuleEngineCalculatedFieldQueueService getCalculatedFieldQueueService(); + JobService getJobService(); + boolean isExternalNodeForceAck(); /** diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/TenantIdLoader.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/TenantIdLoader.java index f12a856567..93fad4c0e7 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/TenantIdLoader.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/TenantIdLoader.java @@ -33,6 +33,7 @@ import org.thingsboard.server.common.data.id.DomainId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityViewId; +import org.thingsboard.server.common.data.id.JobId; import org.thingsboard.server.common.data.id.MobileAppBundleId; import org.thingsboard.server.common.data.id.MobileAppId; import org.thingsboard.server.common.data.id.NotificationRequestId; @@ -175,6 +176,9 @@ public class TenantIdLoader { tenantEntity = null; } break; + case JOB: + tenantEntity = ctx.getJobService().findJobById(ctxTenantId, new JobId(id)); + break; default: throw new RuntimeException("Unexpected entity type: " + entityId.getEntityType()); } diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/util/TenantIdLoaderTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/util/TenantIdLoaderTest.java index 38417c3922..4cbc091bdc 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/util/TenantIdLoaderTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/util/TenantIdLoaderTest.java @@ -54,6 +54,7 @@ import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.id.NotificationId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantProfileId; +import org.thingsboard.server.common.data.job.Job; import org.thingsboard.server.common.data.mobile.app.MobileApp; import org.thingsboard.server.common.data.mobile.bundle.MobileAppBundle; import org.thingsboard.server.common.data.notification.NotificationRequest; @@ -88,6 +89,7 @@ import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.queue.QueueStatsService; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.job.JobService; import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.dao.widget.WidgetTypeService; import org.thingsboard.server.dao.widget.WidgetsBundleService; @@ -160,6 +162,8 @@ public class TenantIdLoaderTest { private MobileAppBundleService mobileAppBundleService; @Mock private CalculatedFieldService calculatedFieldService; + @Mock + private JobService jobService; private TenantId tenantId; private TenantProfileId tenantProfileId; @@ -419,6 +423,12 @@ public class TenantIdLoaderTest { when(ctx.getCalculatedFieldService()).thenReturn(calculatedFieldService); doReturn(calculatedFieldLink).when(calculatedFieldService).findCalculatedFieldLinkById(eq(tenantId), any()); break; + case JOB: + Job job = new Job(); + job.setTenantId(tenantId); + when(ctx.getJobService()).thenReturn(jobService); + doReturn(job).when(jobService).findJobById(eq(tenantId), any()); + break; default: throw new RuntimeException("Unexpected originator EntityType " + entityType); }