Browse Source

Cleanup code

pull/13286/head
ViacheslavKlimov 1 year ago
parent
commit
44a4d9d690
  1. 6
      application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
  2. 8
      application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
  3. 105
      application/src/main/java/org/thingsboard/server/service/job/CfReprocessingJobProcessor.java
  4. 57
      application/src/main/java/org/thingsboard/server/service/job/task/CfReprocessingTaskProcessor.java
  5. 43
      common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobConfiguration.java
  6. 25
      common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobResult.java
  7. 72
      common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingTask.java
  8. 1
      common/data/src/main/java/org/thingsboard/server/common/data/job/Job.java
  9. 1
      common/data/src/main/java/org/thingsboard/server/common/data/job/JobConfiguration.java
  10. 1
      common/data/src/main/java/org/thingsboard/server/common/data/job/JobResult.java
  11. 1
      common/data/src/main/java/org/thingsboard/server/common/data/job/JobType.java
  12. 1
      common/data/src/main/java/org/thingsboard/server/common/data/job/Task.java
  13. 2
      common/data/src/main/java/org/thingsboard/server/common/data/job/TaskFailure.java
  14. 2
      dao/src/main/resources/sql/schema-entities.sql
  15. 3
      rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
  16. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/TenantIdLoader.java
  17. 10
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/util/TenantIdLoaderTest.java

6
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;

8
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();

105
application/src/main/java/org/thingsboard/server/service/job/CfReprocessingJobProcessor.java

@ -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<Task> 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<? extends EntityId> 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<TaskFailure> failures, Consumer<Task> 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;
}
}

57
application/src/main/java/org/thingsboard/server/service/job/task/CfReprocessingTaskProcessor.java

@ -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<CfReprocessingTask> {
private final CalculatedFieldReprocessingService cfReprocessingService;
@Override
public void process(CfReprocessingTask task) throws Exception {
SettableFuture<Void> 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;
}
}

43
common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobConfiguration.java

@ -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;
}
}

25
common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingJobResult.java

@ -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;
}
}

72
common/data/src/main/java/org/thingsboard/server/common/data/job/CfReprocessingTask.java

@ -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;
}
}
}

1
common/data/src/main/java/org/thingsboard/server/common/data/job/Job.java

@ -54,7 +54,6 @@ public class Job extends BaseData<JobId> implements HasTenantId {
this.description = description;
this.configuration = configuration;
this.result = switch (type) {
case CF_REPROCESSING -> new CfReprocessingJobResult();
case DUMMY -> new DummyJobResult();
};
}

1
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

1
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

1
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() {

1
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

2
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 {

2
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
);

3
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();
/**

4
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());
}

10
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);
}

Loading…
Cancel
Save