Refactoring of the JS API to separate module: Script API
This commit is contained in:
parent
d7aa2e5660
commit
9769f95c27
@ -110,7 +110,15 @@
|
||||
<artifactId>queue</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<groupId>org.thingsboard.common.script</groupId>
|
||||
<artifactId>script-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common.script</groupId>
|
||||
<artifactId>remote-js-client</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>stats</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
||||
@ -15,9 +15,7 @@
|
||||
*/
|
||||
package org.thingsboard.server.actors;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.google.common.util.concurrent.FutureCallback;
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
@ -77,7 +75,7 @@ import org.thingsboard.server.dao.timeseries.TimeseriesService;
|
||||
import org.thingsboard.server.dao.user.UserService;
|
||||
import org.thingsboard.server.queue.discovery.PartitionService;
|
||||
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
import org.thingsboard.server.service.component.ComponentDiscoveryService;
|
||||
@ -92,7 +90,7 @@ import org.thingsboard.server.service.profile.TbDeviceProfileCache;
|
||||
import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService;
|
||||
import org.thingsboard.server.service.rpc.TbRpcService;
|
||||
import org.thingsboard.server.service.rpc.TbRuleEngineDeviceRpcService;
|
||||
import org.thingsboard.server.service.script.JsInvokeService;
|
||||
import org.thingsboard.script.api.JsInvokeService;
|
||||
import org.thingsboard.server.service.session.DeviceSessionCacheService;
|
||||
import org.thingsboard.server.service.sms.SmsExecutorService;
|
||||
import org.thingsboard.server.service.state.DeviceStateService;
|
||||
@ -105,7 +103,6 @@ import javax.annotation.PostConstruct;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
@ -152,7 +149,7 @@ public class ActorSystemContext {
|
||||
|
||||
@Autowired
|
||||
@Getter
|
||||
private TbApiUsageClient apiUsageClient;
|
||||
private TbApiUsageReportClient apiUsageClient;
|
||||
|
||||
@Autowired
|
||||
@Getter
|
||||
|
||||
@ -48,7 +48,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
|
||||
import org.thingsboard.server.queue.TbQueueCallback;
|
||||
import org.thingsboard.server.queue.common.MultipleTbQueueTbMsgCallbackWrapper;
|
||||
import org.thingsboard.server.queue.common.TbQueueTbMsgCallbackWrapper;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.cluster.TbClusterService;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -73,7 +73,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
|
||||
private final Map<RuleNodeId, List<RuleNodeRelation>> nodeRoutes;
|
||||
private final RuleChainService service;
|
||||
private final TbClusterService clusterService;
|
||||
private final TbApiUsageClient apiUsageClient;
|
||||
private final TbApiUsageReportClient apiUsageClient;
|
||||
private String ruleChainName;
|
||||
|
||||
private RuleNodeId firstId;
|
||||
|
||||
@ -31,7 +31,7 @@ import org.thingsboard.server.common.msg.TbMsg;
|
||||
import org.thingsboard.server.common.msg.queue.PartitionChangeMsg;
|
||||
import org.thingsboard.server.common.msg.queue.RuleNodeException;
|
||||
import org.thingsboard.server.common.msg.queue.RuleNodeInfo;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
|
||||
/**
|
||||
* @author Andrew Shvayka
|
||||
@ -40,7 +40,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
|
||||
|
||||
private final String ruleChainName;
|
||||
private final TbActorRef self;
|
||||
private final TbApiUsageClient apiUsageClient;
|
||||
private final TbApiUsageReportClient apiUsageClient;
|
||||
private RuleNode ruleNode;
|
||||
private TbNode tbNode;
|
||||
private DefaultTbContext defaultCtx;
|
||||
|
||||
@ -65,7 +65,7 @@ import org.thingsboard.server.common.msg.TbMsgMetaData;
|
||||
import org.thingsboard.server.dao.event.EventService;
|
||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||
import org.thingsboard.server.service.rule.TbRuleChainService;
|
||||
import org.thingsboard.server.service.script.JsInvokeService;
|
||||
import org.thingsboard.script.api.JsInvokeService;
|
||||
import org.thingsboard.server.service.script.RuleNodeJsScriptEngine;
|
||||
import org.thingsboard.server.service.security.permission.Operation;
|
||||
import org.thingsboard.server.service.security.permission.Resource;
|
||||
|
||||
@ -21,16 +21,15 @@ import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.data.id.TenantProfileId;
|
||||
import org.thingsboard.server.common.msg.queue.TbCallback;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToUsageStatsServiceMsg;
|
||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent;
|
||||
|
||||
public interface TbApiUsageStateService extends ApplicationListener<PartitionChangeEvent> {
|
||||
public interface TbApiUsageStateService extends TbApiUsageStateClient, ApplicationListener<PartitionChangeEvent> {
|
||||
|
||||
void process(TbProtoQueueMsg<ToUsageStatsServiceMsg> msg, TbCallback callback);
|
||||
|
||||
ApiUsageState getApiUsageState(TenantId tenantId);
|
||||
|
||||
void onTenantProfileUpdate(TenantProfileId tenantProfileId);
|
||||
|
||||
void onTenantUpdate(TenantId tenantId);
|
||||
|
||||
@ -44,7 +44,7 @@ import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.dao.exception.IncorrectParameterException;
|
||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
@ -70,7 +70,7 @@ public class DefaultMailService implements MailService {
|
||||
private final MessageSource messages;
|
||||
private final Configuration freemarkerConfig;
|
||||
private final AdminSettingsService adminSettingsService;
|
||||
private final TbApiUsageClient apiUsageClient;
|
||||
private final TbApiUsageReportClient apiUsageClient;
|
||||
|
||||
private static final long DEFAULT_TIMEOUT = 10_000;
|
||||
|
||||
@ -90,7 +90,7 @@ public class DefaultMailService implements MailService {
|
||||
|
||||
private long timeout;
|
||||
|
||||
public DefaultMailService(MessageSource messages, Configuration freemarkerConfig, AdminSettingsService adminSettingsService, TbApiUsageClient apiUsageClient) {
|
||||
public DefaultMailService(MessageSource messages, Configuration freemarkerConfig, AdminSettingsService adminSettingsService, TbApiUsageReportClient apiUsageClient) {
|
||||
this.messages = messages;
|
||||
this.freemarkerConfig = freemarkerConfig;
|
||||
this.adminSettingsService = adminSettingsService;
|
||||
|
||||
@ -32,7 +32,7 @@ import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
||||
import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
@ -45,11 +45,11 @@ public class DefaultSmsService implements SmsService {
|
||||
private final SmsSenderFactory smsSenderFactory;
|
||||
private final AdminSettingsService adminSettingsService;
|
||||
private final TbApiUsageStateService apiUsageStateService;
|
||||
private final TbApiUsageClient apiUsageClient;
|
||||
private final TbApiUsageReportClient apiUsageClient;
|
||||
|
||||
private SmsSender smsSender;
|
||||
|
||||
public DefaultSmsService(SmsSenderFactory smsSenderFactory, AdminSettingsService adminSettingsService, TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient) {
|
||||
public DefaultSmsService(SmsSenderFactory smsSenderFactory, AdminSettingsService adminSettingsService, TbApiUsageStateService apiUsageStateService, TbApiUsageReportClient apiUsageClient) {
|
||||
this.smsSenderFactory = smsSenderFactory;
|
||||
this.adminSettingsService = adminSettingsService;
|
||||
this.apiUsageStateService = apiUsageStateService;
|
||||
|
||||
@ -44,7 +44,7 @@ import org.thingsboard.server.dao.alarm.AlarmOperationResult;
|
||||
import org.thingsboard.server.dao.alarm.AlarmService;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.queue.discovery.PartitionService;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
import org.thingsboard.server.cluster.TbClusterService;
|
||||
import org.thingsboard.server.service.subscription.SubscriptionManagerService;
|
||||
@ -61,13 +61,13 @@ import java.util.Optional;
|
||||
public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService implements AlarmSubscriptionService {
|
||||
|
||||
private final AlarmService alarmService;
|
||||
private final TbApiUsageClient apiUsageClient;
|
||||
private final TbApiUsageReportClient apiUsageClient;
|
||||
private final TbApiUsageStateService apiUsageStateService;
|
||||
|
||||
public DefaultAlarmSubscriptionService(TbClusterService clusterService,
|
||||
PartitionService partitionService,
|
||||
AlarmService alarmService,
|
||||
TbApiUsageClient apiUsageClient,
|
||||
TbApiUsageReportClient apiUsageClient,
|
||||
TbApiUsageStateService apiUsageStateService) {
|
||||
super(clusterService, partitionService);
|
||||
this.alarmService = alarmService;
|
||||
|
||||
@ -47,7 +47,7 @@ import org.thingsboard.server.dao.attributes.AttributesService;
|
||||
import org.thingsboard.server.dao.timeseries.TimeseriesService;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.queue.discovery.PartitionService;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
import org.thingsboard.server.service.entitiy.entityview.TbEntityViewService;
|
||||
import org.thingsboard.server.service.subscription.TbSubscriptionUtils;
|
||||
@ -77,7 +77,7 @@ public class DefaultTelemetrySubscriptionService extends AbstractSubscriptionSer
|
||||
private final AttributesService attrService;
|
||||
private final TimeseriesService tsService;
|
||||
private final TbEntityViewService tbEntityViewService;
|
||||
private final TbApiUsageClient apiUsageClient;
|
||||
private final TbApiUsageReportClient apiUsageClient;
|
||||
private final TbApiUsageStateService apiUsageStateService;
|
||||
|
||||
private ExecutorService tsCallBackExecutor;
|
||||
@ -87,7 +87,7 @@ public class DefaultTelemetrySubscriptionService extends AbstractSubscriptionSer
|
||||
@Lazy TbEntityViewService tbEntityViewService,
|
||||
TbClusterService clusterService,
|
||||
PartitionService partitionService,
|
||||
TbApiUsageClient apiUsageClient,
|
||||
TbApiUsageReportClient apiUsageClient,
|
||||
TbApiUsageStateService apiUsageStateService) {
|
||||
super(clusterService, partitionService);
|
||||
this.attrService = attrService;
|
||||
|
||||
@ -599,6 +599,21 @@ state:
|
||||
defaultStateCheckIntervalInSec: "${DEFAULT_STATE_CHECK_INTERVAL:60}"
|
||||
persistToTelemetry: "${PERSIST_STATE_TO_TELEMETRY:false}"
|
||||
|
||||
mvel:
|
||||
enabled: "${MVEL_ENABLED:true}"
|
||||
max_total_args_size: "${MVEL_MAX_TOTAL_ARGS_SIZE:100000}"
|
||||
max_result_size: "${MVEL_MAX_RESULT_SIZE:300000}"
|
||||
max_script_body_size: "${MVEL_MAX_SCRIPT_BODY_SIZE:50000}"
|
||||
# Maximum allowed MVEL script execution errors before it will be blacklisted
|
||||
max_errors: "${MVEL_MAX_ERRORS:3}"
|
||||
# MVEL Eval max request timeout in milliseconds. 0 - no timeout
|
||||
max_requests_timeout: "${MVEL_MAX_REQUEST_TIMEOUT:500}"
|
||||
# Maximum time in seconds for black listed function to stay in the list.
|
||||
max_black_list_duration_sec: "${MVEL_MAX_BLACKLIST_DURATION_SEC:60}"
|
||||
stats:
|
||||
enabled: "${TB_MVEL_STATS_ENABLED:false}"
|
||||
print_interval_ms: "${TB_MVEL_STATS_PRINT_INTERVAL_MS:10000}"
|
||||
|
||||
js:
|
||||
evaluator: "${JS_EVALUATOR:local}" # local/remote
|
||||
max_total_args_size: "${JS_MAX_TOTAL_ARGS_SIZE:100000}"
|
||||
|
||||
@ -19,6 +19,8 @@ import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.test.context.TestPropertySource;
|
||||
import org.thingsboard.script.api.JsScriptType;
|
||||
import org.thingsboard.script.api.NashornJsInvokeService;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.controller.AbstractControllerTest;
|
||||
import org.thingsboard.server.dao.service.DaoSqlTest;
|
||||
|
||||
@ -20,6 +20,8 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.script.api.JsInvokeService;
|
||||
import org.thingsboard.script.api.JsScriptType;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
|
||||
|
||||
@ -47,6 +47,7 @@
|
||||
<module>coap-server</module>
|
||||
<module>edge-api</module>
|
||||
<module>version-control</module>
|
||||
<module>script</module>
|
||||
</modules>
|
||||
|
||||
</project>
|
||||
|
||||
@ -17,9 +17,7 @@ package org.thingsboard.server.queue.usagestats;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
@ -48,7 +46,7 @@ import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class DefaultTbApiUsageClient implements TbApiUsageClient {
|
||||
public class DefaultTbApiUsageReportClient implements TbApiUsageReportClient {
|
||||
|
||||
@Value("${usage.stats.report.enabled:true}")
|
||||
private boolean enabled;
|
||||
@ -64,7 +62,7 @@ public class DefaultTbApiUsageClient implements TbApiUsageClient {
|
||||
private final TbQueueProducerProvider producerProvider;
|
||||
private TbQueueProducer<TbProtoQueueMsg<ToUsageStatsServiceMsg>> msgProducer;
|
||||
|
||||
public DefaultTbApiUsageClient(PartitionService partitionService, SchedulerComponent scheduler, TbQueueProducerProvider producerProvider) {
|
||||
public DefaultTbApiUsageReportClient(PartitionService partitionService, SchedulerComponent scheduler, TbQueueProducerProvider producerProvider) {
|
||||
this.partitionService = partitionService;
|
||||
this.scheduler = scheduler;
|
||||
this.producerProvider = producerProvider;
|
||||
@ -19,7 +19,7 @@ import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
|
||||
public interface TbApiUsageClient {
|
||||
public interface TbApiUsageReportClient {
|
||||
|
||||
void report(TenantId tenantId, CustomerId customerId, ApiUsageRecordKey key, long value);
|
||||
|
||||
42
common/script/pom.xml
Normal file
42
common/script/pom.xml
Normal file
@ -0,0 +1,42 @@
|
||||
<!--
|
||||
|
||||
Copyright © 2016-2022 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.
|
||||
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.thingsboard</groupId>
|
||||
<version>3.4.2-SNAPSHOT</version>
|
||||
<artifactId>common</artifactId>
|
||||
</parent>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>script</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>Thingsboard Script Invoke Commons</name>
|
||||
<url>https://thingsboard.io</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<main.dir>${basedir}/../..</main.dir>
|
||||
</properties>
|
||||
<modules>
|
||||
<module>script-api</module>
|
||||
<module>remote-js-client</module>
|
||||
</modules>
|
||||
|
||||
</project>
|
||||
89
common/script/remote-js-client/pom.xml
Normal file
89
common/script/remote-js-client/pom.xml
Normal file
@ -0,0 +1,89 @@
|
||||
<!--
|
||||
|
||||
Copyright © 2016-2022 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.
|
||||
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<version>3.4.2-SNAPSHOT</version>
|
||||
<artifactId>script</artifactId>
|
||||
</parent>
|
||||
<groupId>org.thingsboard.common.script</groupId>
|
||||
<artifactId>remote-js-client</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>Thingsboard Server JS Client for remote JS execution</name>
|
||||
<url>https://thingsboard.io</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<main.dir>${basedir}/../../..</main.dir>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>queue</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common.script</groupId>
|
||||
<artifactId>script-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.rule-engine</groupId>
|
||||
<artifactId>rule-engine-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>data</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>message</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>thingsboard-repo-deploy</id>
|
||||
<name>ThingsBoard Repo Deployment</name>
|
||||
<url>https://repo.thingsboard.io/artifactory/libs-release-public</url>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
</project>
|
||||
@ -27,17 +27,19 @@ import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StopWatch;
|
||||
import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
||||
import org.thingsboard.script.api.AbstractJsInvokeService;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||
import org.thingsboard.server.gen.js.JsInvokeProtos;
|
||||
import org.thingsboard.server.queue.TbQueueRequestTemplate;
|
||||
import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
|
||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@ -78,8 +80,8 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
|
||||
private final ExecutorService callbackExecutor = Executors.newFixedThreadPool(
|
||||
Runtime.getRuntime().availableProcessors(), ThingsBoardThreadFactory.forName("js-executor-remote-callback"));
|
||||
|
||||
public RemoteJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient) {
|
||||
super(apiUsageStateService, apiUsageClient);
|
||||
public RemoteJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageClient) {
|
||||
super(apiUsageStateClient, apiUsageClient);
|
||||
}
|
||||
|
||||
@Scheduled(fixedDelayString = "${js.remote.stats.print_interval_ms}")
|
||||
@ -22,6 +22,9 @@ import com.google.common.util.concurrent.Futures;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.common.util.concurrent.MoreExecutors;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.thingsboard.script.api.JsInvokeService;
|
||||
import org.thingsboard.script.api.JsScriptType;
|
||||
import org.thingsboard.script.api.RuleNodeScriptFactory;
|
||||
import org.thingsboard.server.common.data.StringUtils;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.EntityId;
|
||||
117
common/script/script-api/pom.xml
Normal file
117
common/script/script-api/pom.xml
Normal file
@ -0,0 +1,117 @@
|
||||
<!--
|
||||
|
||||
Copyright © 2016-2022 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.
|
||||
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<version>3.4.2-SNAPSHOT</version>
|
||||
<artifactId>script</artifactId>
|
||||
</parent>
|
||||
<groupId>org.thingsboard.common.script</groupId>
|
||||
<artifactId>script-api</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>Thingsboard Server Script invoke API</name>
|
||||
<url>https://thingsboard.io</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<main.dir>${basedir}/../../..</main.dir>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>data</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>stats</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common</groupId>
|
||||
<artifactId>util</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.javadelight</groupId>
|
||||
<artifactId>delight-nashorn-sandbox</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>log4j-over-slf4j</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>thingsboard-repo-deploy</id>
|
||||
<name>ThingsBoard Repo Deployment</name>
|
||||
<url>https://repo.thingsboard.io/artifactory/libs-release-public</url>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
</project>
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.script.api;
|
||||
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
@ -25,10 +25,11 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
||||
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.Executors;
|
||||
@ -43,8 +44,8 @@ import static java.lang.String.format;
|
||||
@Slf4j
|
||||
public abstract class AbstractJsInvokeService implements JsInvokeService {
|
||||
|
||||
private final TbApiUsageStateService apiUsageStateService;
|
||||
private final TbApiUsageClient apiUsageClient;
|
||||
private final Optional<TbApiUsageStateClient> apiUsageStateClient;
|
||||
private final Optional<TbApiUsageReportClient> apiUsageReportClient;
|
||||
protected ScheduledExecutorService timeoutExecutorService;
|
||||
protected Map<UUID, String> scriptIdToNameMap = new ConcurrentHashMap<>();
|
||||
protected Map<UUID, DisableListInfo> disabledFunctions = new ConcurrentHashMap<>();
|
||||
@ -59,9 +60,9 @@ public abstract class AbstractJsInvokeService implements JsInvokeService {
|
||||
@Value("${js.max_script_body_size:50000}")
|
||||
private long maxScriptBodySize;
|
||||
|
||||
protected AbstractJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient) {
|
||||
this.apiUsageStateService = apiUsageStateService;
|
||||
this.apiUsageClient = apiUsageClient;
|
||||
protected AbstractJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageReportClient) {
|
||||
this.apiUsageStateClient = apiUsageStateClient;
|
||||
this.apiUsageReportClient = apiUsageReportClient;
|
||||
}
|
||||
|
||||
public void init(long maxRequestsTimeout) {
|
||||
@ -78,7 +79,7 @@ public abstract class AbstractJsInvokeService implements JsInvokeService {
|
||||
|
||||
@Override
|
||||
public ListenableFuture<UUID> eval(TenantId tenantId, JsScriptType scriptType, String scriptBody, String... argNames) {
|
||||
if (apiUsageStateService.getApiUsageState(tenantId).isJsExecEnabled()) {
|
||||
if (!apiUsageStateClient.isPresent() || apiUsageStateClient.get().getApiUsageState(tenantId).isJsExecEnabled()) {
|
||||
if (scriptBodySizeExceeded(scriptBody)) {
|
||||
return error(format("Script body exceeds maximum allowed size of %s symbols", getMaxScriptBodySize()));
|
||||
}
|
||||
@ -93,7 +94,7 @@ public abstract class AbstractJsInvokeService implements JsInvokeService {
|
||||
|
||||
@Override
|
||||
public ListenableFuture<String> invokeFunction(TenantId tenantId, CustomerId customerId, UUID scriptId, Object... args) {
|
||||
if (apiUsageStateService.getApiUsageState(tenantId).isJsExecEnabled()) {
|
||||
if (!apiUsageStateClient.isPresent() || apiUsageStateClient.get().getApiUsageState(tenantId).isJsExecEnabled()) {
|
||||
String functionName = scriptIdToNameMap.get(scriptId);
|
||||
if (functionName == null) {
|
||||
return error("No compiled script found for scriptId: [" + scriptId + "]!");
|
||||
@ -102,7 +103,7 @@ public abstract class AbstractJsInvokeService implements JsInvokeService {
|
||||
if (argsSizeExceeded(args)) {
|
||||
return scriptExecutionError(scriptId, format("Script input arguments exceed maximum allowed total args size of %s symbols", getMaxTotalArgsSize()));
|
||||
}
|
||||
apiUsageClient.report(tenantId, customerId, ApiUsageRecordKey.JS_EXEC_COUNT, 1);
|
||||
apiUsageReportClient.ifPresent(client -> client.report(tenantId, customerId, ApiUsageRecordKey.JS_EXEC_COUNT, 1));
|
||||
return Futures.transformAsync(doInvokeFunction(scriptId, functionName, args), output -> {
|
||||
String result = output.toString();
|
||||
if (resultSizeExceeded(result)) {
|
||||
@ -13,11 +13,12 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.script.api;
|
||||
|
||||
import com.google.common.util.concurrent.FutureCallback;
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.common.util.concurrent.ListeningExecutorService;
|
||||
import com.google.common.util.concurrent.MoreExecutors;
|
||||
import delight.nashornsandbox.NashornSandbox;
|
||||
import delight.nashornsandbox.NashornSandboxes;
|
||||
@ -26,8 +27,8 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.thingsboard.common.util.ThingsBoardExecutors;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
@ -35,6 +36,7 @@ import javax.script.Invocable;
|
||||
import javax.script.ScriptEngine;
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@ -49,6 +51,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
||||
private NashornSandbox sandbox;
|
||||
private ScriptEngine engine;
|
||||
private ExecutorService monitorExecutorService;
|
||||
private ListeningExecutorService jsExecutor;
|
||||
|
||||
private final AtomicInteger jsPushedMsgs = new AtomicInteger(0);
|
||||
private final AtomicInteger jsInvokeMsgs = new AtomicInteger(0);
|
||||
@ -60,18 +63,17 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
||||
|
||||
private final ReentrantLock evalLock = new ReentrantLock();
|
||||
|
||||
@Getter
|
||||
private final JsExecutorService jsExecutor;
|
||||
|
||||
@Value("${js.local.max_requests_timeout:0}")
|
||||
private long maxRequestsTimeout;
|
||||
|
||||
@Value("${js.local.stats.enabled:false}")
|
||||
private boolean statsEnabled;
|
||||
|
||||
public AbstractNashornJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient, JsExecutorService jsExecutor) {
|
||||
super(apiUsageStateService, apiUsageClient);
|
||||
this.jsExecutor = jsExecutor;
|
||||
@Value("${js.local.js_thread_pool_size:50}")
|
||||
private int jsExecutorThreadPoolSize;
|
||||
|
||||
public AbstractNashornJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageReportClient) {
|
||||
super(apiUsageStateClient, apiUsageReportClient);
|
||||
}
|
||||
|
||||
@Scheduled(fixedDelayString = "${js.local.stats.print_interval_ms:10000}")
|
||||
@ -92,6 +94,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
super.init(maxRequestsTimeout);
|
||||
jsExecutor = MoreExecutors.listeningDecorator(Executors.newWorkStealingPool(jsExecutorThreadPoolSize));
|
||||
if (useJsSandbox()) {
|
||||
sandbox = NashornSandboxes.create();
|
||||
monitorExecutorService = ThingsBoardExecutors.newWorkStealingPool(getMonitorThreadPoolSize(), "nashorn-js-monitor");
|
||||
@ -123,7 +126,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
||||
@Override
|
||||
protected ListenableFuture<UUID> doEval(UUID scriptId, String functionName, String jsScript) {
|
||||
jsPushedMsgs.incrementAndGet();
|
||||
ListenableFuture<UUID> result = jsExecutor.executeAsync(() -> {
|
||||
ListenableFuture<UUID> result = jsExecutor.submit(() -> {
|
||||
try {
|
||||
evalLock.lock();
|
||||
try {
|
||||
@ -152,7 +155,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
||||
@Override
|
||||
protected ListenableFuture<Object> doInvokeFunction(UUID scriptId, String functionName, Object[] args) {
|
||||
jsPushedMsgs.incrementAndGet();
|
||||
ListenableFuture<Object> result = jsExecutor.executeAsync(() -> {
|
||||
ListenableFuture<Object> result = jsExecutor.submit(() -> {
|
||||
try {
|
||||
if (useJsSandbox()) {
|
||||
return sandbox.getSandboxedInvocable().invokeFunction(functionName, args);
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.script.api;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.script.api;
|
||||
|
||||
public enum JsScriptType {
|
||||
RULE_NODE_SCRIPT
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.script.api;
|
||||
|
||||
import com.google.common.util.concurrent.FutureCallback;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -13,16 +13,17 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.script.api;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Slf4j
|
||||
@ -48,8 +49,8 @@ public class NashornJsInvokeService extends AbstractNashornJsInvokeService {
|
||||
@Value("${js.local.max_black_list_duration_sec:60}")
|
||||
private int maxBlackListDurationSec;
|
||||
|
||||
public NashornJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient, JsExecutorService jsExecutor) {
|
||||
super(apiUsageStateService, apiUsageClient, jsExecutor);
|
||||
public NashornJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageReportClient) {
|
||||
super(apiUsageStateClient, apiUsageReportClient);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.script.api;
|
||||
|
||||
public class RuleNodeScriptFactory {
|
||||
|
||||
@ -13,17 +13,16 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.server.common.stats;
|
||||
|
||||
import java.util.List;
|
||||
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
|
||||
/**
|
||||
* Created by ashvayka on 25.09.18.
|
||||
*/
|
||||
public class JsInvokeResponse {
|
||||
public interface TbApiUsageReportClient {
|
||||
|
||||
private String scriptId;
|
||||
private String scriptBody;
|
||||
private List<String> args;
|
||||
void report(TenantId tenantId, CustomerId customerId, ApiUsageRecordKey key, long value);
|
||||
|
||||
void report(TenantId tenantId, CustomerId customerId, ApiUsageRecordKey key);
|
||||
|
||||
}
|
||||
@ -13,17 +13,13 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.script;
|
||||
package org.thingsboard.server.common.stats;
|
||||
|
||||
import java.util.List;
|
||||
import org.thingsboard.server.common.data.ApiUsageState;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
|
||||
/**
|
||||
* Created by ashvayka on 25.09.18.
|
||||
*/
|
||||
public class JsInvokeRequest {
|
||||
public interface TbApiUsageStateClient {
|
||||
|
||||
private String scriptId;
|
||||
private String scriptBody;
|
||||
private List<String> args;
|
||||
ApiUsageState getApiUsageState(TenantId tenantId);
|
||||
|
||||
}
|
||||
@ -94,7 +94,7 @@ import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
||||
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
|
||||
import org.thingsboard.server.queue.provider.TbTransportQueueFactory;
|
||||
import org.thingsboard.server.queue.scheduler.SchedulerComponent;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
||||
import org.thingsboard.server.queue.usagestats.TbApiUsageReportClient;
|
||||
import org.thingsboard.server.queue.util.AfterStartUp;
|
||||
import org.thingsboard.server.queue.util.TbTransportComponent;
|
||||
|
||||
@ -157,7 +157,7 @@ public class DefaultTransportService implements TransportService {
|
||||
|
||||
@Autowired
|
||||
@Lazy
|
||||
private TbApiUsageClient apiUsageClient;
|
||||
private TbApiUsageReportClient apiUsageClient;
|
||||
private final Map<String, Number> statsMap = new LinkedHashMap<>();
|
||||
|
||||
private final Gson gson = new Gson();
|
||||
|
||||
10
pom.xml
10
pom.xml
@ -969,6 +969,16 @@
|
||||
<artifactId>coap-server</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common.script</groupId>
|
||||
<artifactId>script-api</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard.common.script</groupId>
|
||||
<artifactId>remote-js-client</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.thingsboard</groupId>
|
||||
<artifactId>tools</artifactId>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user