From 9567dd3090c04eda484c86e69620e3fd26bc739e Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Thu, 12 Jun 2025 16:47:44 +0300 Subject: [PATCH] AI rule node: encapsulate AI requests thread pool properties --- .../ai/AiRequestsExecutorProperties.java | 43 ------------------- .../service/ai/DefaultAiRequestsExecutor.java | 26 +++++++++++ 2 files changed, 26 insertions(+), 43 deletions(-) delete mode 100644 application/src/main/java/org/thingsboard/server/service/ai/AiRequestsExecutorProperties.java diff --git a/application/src/main/java/org/thingsboard/server/service/ai/AiRequestsExecutorProperties.java b/application/src/main/java/org/thingsboard/server/service/ai/AiRequestsExecutorProperties.java deleted file mode 100644 index 52a0d0d57e..0000000000 --- a/application/src/main/java/org/thingsboard/server/service/ai/AiRequestsExecutorProperties.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.service.ai; - -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.validation.annotation.Validated; - -@Data -@Validated -@Configuration -@ConfigurationProperties(prefix = "actors.rule.ai-requests-thread-pool") -class AiRequestsExecutorProperties { - - @NotBlank(message = "Pool name must be not blank") - private String poolName = "ai-requests"; - - @Min(value = 1, message = "Pool size must be at least 1") - private int poolSize = 50; - - @Min(value = 1, message = "Max queue size must be at least 1") - private int maxQueueSize = 10000; - - @Min(value = 1, message = "Termination timeout must be at least 1 second") - private int terminationTimeoutSeconds = 60; - -} diff --git a/application/src/main/java/org/thingsboard/server/service/ai/DefaultAiRequestsExecutor.java b/application/src/main/java/org/thingsboard/server/service/ai/DefaultAiRequestsExecutor.java index 40a5bdbb63..ae0663eefc 100644 --- a/application/src/main/java/org/thingsboard/server/service/ai/DefaultAiRequestsExecutor.java +++ b/application/src/main/java/org/thingsboard/server/service/ai/DefaultAiRequestsExecutor.java @@ -23,9 +23,15 @@ import dev.langchain4j.model.chat.request.ChatRequest; import dev.langchain4j.model.chat.response.ChatResponse; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; import lombok.RequiredArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.rule.engine.api.AiRequestsExecutor; @@ -38,6 +44,26 @@ class DefaultAiRequestsExecutor implements AiRequestsExecutor { private final AiRequestsExecutorProperties properties; + @Data + @Validated + @Configuration + @ConfigurationProperties(prefix = "actors.rule.ai-requests-thread-pool") + private static class AiRequestsExecutorProperties { + + @NotBlank(message = "Pool name must be not blank") + private String poolName = "ai-requests"; + + @Min(value = 1, message = "Pool size must be at least 1") + private int poolSize = 50; + + @Min(value = 1, message = "Max queue size must be at least 1") + private int maxQueueSize = 10000; + + @Min(value = 1, message = "Termination timeout must be at least 1 second") + private int terminationTimeoutSeconds = 60; + + } + private ListeningExecutorService executorService; @PostConstruct