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>
|
<artifactId>queue</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<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>
|
<artifactId>stats</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -15,9 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.actors;
|
package org.thingsboard.server.actors;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
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.FutureCallback;
|
||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
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.dao.user.UserService;
|
||||||
import org.thingsboard.server.queue.discovery.PartitionService;
|
import org.thingsboard.server.queue.discovery.PartitionService;
|
||||||
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
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.queue.util.DataDecodingEncodingService;
|
||||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||||
import org.thingsboard.server.service.component.ComponentDiscoveryService;
|
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.TbCoreDeviceRpcService;
|
||||||
import org.thingsboard.server.service.rpc.TbRpcService;
|
import org.thingsboard.server.service.rpc.TbRpcService;
|
||||||
import org.thingsboard.server.service.rpc.TbRuleEngineDeviceRpcService;
|
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.session.DeviceSessionCacheService;
|
||||||
import org.thingsboard.server.service.sms.SmsExecutorService;
|
import org.thingsboard.server.service.sms.SmsExecutorService;
|
||||||
import org.thingsboard.server.service.state.DeviceStateService;
|
import org.thingsboard.server.service.state.DeviceStateService;
|
||||||
@ -105,7 +103,6 @@ import javax.annotation.PostConstruct;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
@ -152,7 +149,7 @@ public class ActorSystemContext {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Getter
|
@Getter
|
||||||
private TbApiUsageClient apiUsageClient;
|
private TbApiUsageReportClient apiUsageClient;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
@ -48,7 +48,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
|
|||||||
import org.thingsboard.server.queue.TbQueueCallback;
|
import org.thingsboard.server.queue.TbQueueCallback;
|
||||||
import org.thingsboard.server.queue.common.MultipleTbQueueTbMsgCallbackWrapper;
|
import org.thingsboard.server.queue.common.MultipleTbQueueTbMsgCallbackWrapper;
|
||||||
import org.thingsboard.server.queue.common.TbQueueTbMsgCallbackWrapper;
|
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 org.thingsboard.server.cluster.TbClusterService;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -73,7 +73,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
|
|||||||
private final Map<RuleNodeId, List<RuleNodeRelation>> nodeRoutes;
|
private final Map<RuleNodeId, List<RuleNodeRelation>> nodeRoutes;
|
||||||
private final RuleChainService service;
|
private final RuleChainService service;
|
||||||
private final TbClusterService clusterService;
|
private final TbClusterService clusterService;
|
||||||
private final TbApiUsageClient apiUsageClient;
|
private final TbApiUsageReportClient apiUsageClient;
|
||||||
private String ruleChainName;
|
private String ruleChainName;
|
||||||
|
|
||||||
private RuleNodeId firstId;
|
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.PartitionChangeMsg;
|
||||||
import org.thingsboard.server.common.msg.queue.RuleNodeException;
|
import org.thingsboard.server.common.msg.queue.RuleNodeException;
|
||||||
import org.thingsboard.server.common.msg.queue.RuleNodeInfo;
|
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
|
* @author Andrew Shvayka
|
||||||
@ -40,7 +40,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
|
|||||||
|
|
||||||
private final String ruleChainName;
|
private final String ruleChainName;
|
||||||
private final TbActorRef self;
|
private final TbActorRef self;
|
||||||
private final TbApiUsageClient apiUsageClient;
|
private final TbApiUsageReportClient apiUsageClient;
|
||||||
private RuleNode ruleNode;
|
private RuleNode ruleNode;
|
||||||
private TbNode tbNode;
|
private TbNode tbNode;
|
||||||
private DefaultTbContext defaultCtx;
|
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.dao.event.EventService;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.rule.TbRuleChainService;
|
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.script.RuleNodeJsScriptEngine;
|
||||||
import org.thingsboard.server.service.security.permission.Operation;
|
import org.thingsboard.server.service.security.permission.Operation;
|
||||||
import org.thingsboard.server.service.security.permission.Resource;
|
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.TenantId;
|
||||||
import org.thingsboard.server.common.data.id.TenantProfileId;
|
import org.thingsboard.server.common.data.id.TenantProfileId;
|
||||||
import org.thingsboard.server.common.msg.queue.TbCallback;
|
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.gen.transport.TransportProtos.ToUsageStatsServiceMsg;
|
||||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||||
import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent;
|
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);
|
void process(TbProtoQueueMsg<ToUsageStatsServiceMsg> msg, TbCallback callback);
|
||||||
|
|
||||||
ApiUsageState getApiUsageState(TenantId tenantId);
|
|
||||||
|
|
||||||
void onTenantProfileUpdate(TenantProfileId tenantProfileId);
|
void onTenantProfileUpdate(TenantProfileId tenantProfileId);
|
||||||
|
|
||||||
void onTenantUpdate(TenantId tenantId);
|
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.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.dao.exception.IncorrectParameterException;
|
import org.thingsboard.server.dao.exception.IncorrectParameterException;
|
||||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
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 org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
@ -70,7 +70,7 @@ public class DefaultMailService implements MailService {
|
|||||||
private final MessageSource messages;
|
private final MessageSource messages;
|
||||||
private final Configuration freemarkerConfig;
|
private final Configuration freemarkerConfig;
|
||||||
private final AdminSettingsService adminSettingsService;
|
private final AdminSettingsService adminSettingsService;
|
||||||
private final TbApiUsageClient apiUsageClient;
|
private final TbApiUsageReportClient apiUsageClient;
|
||||||
|
|
||||||
private static final long DEFAULT_TIMEOUT = 10_000;
|
private static final long DEFAULT_TIMEOUT = 10_000;
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ public class DefaultMailService implements MailService {
|
|||||||
|
|
||||||
private long timeout;
|
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.messages = messages;
|
||||||
this.freemarkerConfig = freemarkerConfig;
|
this.freemarkerConfig = freemarkerConfig;
|
||||||
this.adminSettingsService = adminSettingsService;
|
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.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
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 org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
@ -45,11 +45,11 @@ public class DefaultSmsService implements SmsService {
|
|||||||
private final SmsSenderFactory smsSenderFactory;
|
private final SmsSenderFactory smsSenderFactory;
|
||||||
private final AdminSettingsService adminSettingsService;
|
private final AdminSettingsService adminSettingsService;
|
||||||
private final TbApiUsageStateService apiUsageStateService;
|
private final TbApiUsageStateService apiUsageStateService;
|
||||||
private final TbApiUsageClient apiUsageClient;
|
private final TbApiUsageReportClient apiUsageClient;
|
||||||
|
|
||||||
private SmsSender smsSender;
|
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.smsSenderFactory = smsSenderFactory;
|
||||||
this.adminSettingsService = adminSettingsService;
|
this.adminSettingsService = adminSettingsService;
|
||||||
this.apiUsageStateService = apiUsageStateService;
|
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.dao.alarm.AlarmService;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||||
import org.thingsboard.server.queue.discovery.PartitionService;
|
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.apiusage.TbApiUsageStateService;
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
import org.thingsboard.server.cluster.TbClusterService;
|
||||||
import org.thingsboard.server.service.subscription.SubscriptionManagerService;
|
import org.thingsboard.server.service.subscription.SubscriptionManagerService;
|
||||||
@ -61,13 +61,13 @@ import java.util.Optional;
|
|||||||
public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService implements AlarmSubscriptionService {
|
public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService implements AlarmSubscriptionService {
|
||||||
|
|
||||||
private final AlarmService alarmService;
|
private final AlarmService alarmService;
|
||||||
private final TbApiUsageClient apiUsageClient;
|
private final TbApiUsageReportClient apiUsageClient;
|
||||||
private final TbApiUsageStateService apiUsageStateService;
|
private final TbApiUsageStateService apiUsageStateService;
|
||||||
|
|
||||||
public DefaultAlarmSubscriptionService(TbClusterService clusterService,
|
public DefaultAlarmSubscriptionService(TbClusterService clusterService,
|
||||||
PartitionService partitionService,
|
PartitionService partitionService,
|
||||||
AlarmService alarmService,
|
AlarmService alarmService,
|
||||||
TbApiUsageClient apiUsageClient,
|
TbApiUsageReportClient apiUsageClient,
|
||||||
TbApiUsageStateService apiUsageStateService) {
|
TbApiUsageStateService apiUsageStateService) {
|
||||||
super(clusterService, partitionService);
|
super(clusterService, partitionService);
|
||||||
this.alarmService = alarmService;
|
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.dao.timeseries.TimeseriesService;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||||
import org.thingsboard.server.queue.discovery.PartitionService;
|
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.apiusage.TbApiUsageStateService;
|
||||||
import org.thingsboard.server.service.entitiy.entityview.TbEntityViewService;
|
import org.thingsboard.server.service.entitiy.entityview.TbEntityViewService;
|
||||||
import org.thingsboard.server.service.subscription.TbSubscriptionUtils;
|
import org.thingsboard.server.service.subscription.TbSubscriptionUtils;
|
||||||
@ -77,7 +77,7 @@ public class DefaultTelemetrySubscriptionService extends AbstractSubscriptionSer
|
|||||||
private final AttributesService attrService;
|
private final AttributesService attrService;
|
||||||
private final TimeseriesService tsService;
|
private final TimeseriesService tsService;
|
||||||
private final TbEntityViewService tbEntityViewService;
|
private final TbEntityViewService tbEntityViewService;
|
||||||
private final TbApiUsageClient apiUsageClient;
|
private final TbApiUsageReportClient apiUsageClient;
|
||||||
private final TbApiUsageStateService apiUsageStateService;
|
private final TbApiUsageStateService apiUsageStateService;
|
||||||
|
|
||||||
private ExecutorService tsCallBackExecutor;
|
private ExecutorService tsCallBackExecutor;
|
||||||
@ -87,7 +87,7 @@ public class DefaultTelemetrySubscriptionService extends AbstractSubscriptionSer
|
|||||||
@Lazy TbEntityViewService tbEntityViewService,
|
@Lazy TbEntityViewService tbEntityViewService,
|
||||||
TbClusterService clusterService,
|
TbClusterService clusterService,
|
||||||
PartitionService partitionService,
|
PartitionService partitionService,
|
||||||
TbApiUsageClient apiUsageClient,
|
TbApiUsageReportClient apiUsageClient,
|
||||||
TbApiUsageStateService apiUsageStateService) {
|
TbApiUsageStateService apiUsageStateService) {
|
||||||
super(clusterService, partitionService);
|
super(clusterService, partitionService);
|
||||||
this.attrService = attrService;
|
this.attrService = attrService;
|
||||||
|
|||||||
@ -599,6 +599,21 @@ state:
|
|||||||
defaultStateCheckIntervalInSec: "${DEFAULT_STATE_CHECK_INTERVAL:60}"
|
defaultStateCheckIntervalInSec: "${DEFAULT_STATE_CHECK_INTERVAL:60}"
|
||||||
persistToTelemetry: "${PERSIST_STATE_TO_TELEMETRY:false}"
|
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:
|
js:
|
||||||
evaluator: "${JS_EVALUATOR:local}" # local/remote
|
evaluator: "${JS_EVALUATOR:local}" # local/remote
|
||||||
max_total_args_size: "${JS_MAX_TOTAL_ARGS_SIZE:100000}"
|
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.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.test.context.TestPropertySource;
|
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.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.controller.AbstractControllerTest;
|
import org.thingsboard.server.controller.AbstractControllerTest;
|
||||||
import org.thingsboard.server.dao.service.DaoSqlTest;
|
import org.thingsboard.server.dao.service.DaoSqlTest;
|
||||||
|
|||||||
@ -20,6 +20,8 @@ import com.google.common.util.concurrent.ListenableFuture;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.stereotype.Service;
|
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.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
|
||||||
|
|||||||
@ -47,6 +47,7 @@
|
|||||||
<module>coap-server</module>
|
<module>coap-server</module>
|
||||||
<module>edge-api</module>
|
<module>edge-api</module>
|
||||||
<module>version-control</module>
|
<module>version-control</module>
|
||||||
|
<module>script</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -17,9 +17,7 @@ package org.thingsboard.server.queue.usagestats;
|
|||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Lazy;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
@ -48,7 +46,7 @@ import java.util.concurrent.atomic.AtomicLong;
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class DefaultTbApiUsageClient implements TbApiUsageClient {
|
public class DefaultTbApiUsageReportClient implements TbApiUsageReportClient {
|
||||||
|
|
||||||
@Value("${usage.stats.report.enabled:true}")
|
@Value("${usage.stats.report.enabled:true}")
|
||||||
private boolean enabled;
|
private boolean enabled;
|
||||||
@ -64,7 +62,7 @@ public class DefaultTbApiUsageClient implements TbApiUsageClient {
|
|||||||
private final TbQueueProducerProvider producerProvider;
|
private final TbQueueProducerProvider producerProvider;
|
||||||
private TbQueueProducer<TbProtoQueueMsg<ToUsageStatsServiceMsg>> msgProducer;
|
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.partitionService = partitionService;
|
||||||
this.scheduler = scheduler;
|
this.scheduler = scheduler;
|
||||||
this.producerProvider = producerProvider;
|
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.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
|
||||||
public interface TbApiUsageClient {
|
public interface TbApiUsageReportClient {
|
||||||
|
|
||||||
void report(TenantId tenantId, CustomerId customerId, ApiUsageRecordKey key, long value);
|
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.stereotype.Service;
|
||||||
import org.springframework.util.StopWatch;
|
import org.springframework.util.StopWatch;
|
||||||
import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
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.gen.js.JsInvokeProtos;
|
||||||
import org.thingsboard.server.queue.TbQueueRequestTemplate;
|
import org.thingsboard.server.queue.TbQueueRequestTemplate;
|
||||||
import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
|
import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
|
||||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
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.Nullable;
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
@ -78,8 +80,8 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
|
|||||||
private final ExecutorService callbackExecutor = Executors.newFixedThreadPool(
|
private final ExecutorService callbackExecutor = Executors.newFixedThreadPool(
|
||||||
Runtime.getRuntime().availableProcessors(), ThingsBoardThreadFactory.forName("js-executor-remote-callback"));
|
Runtime.getRuntime().availableProcessors(), ThingsBoardThreadFactory.forName("js-executor-remote-callback"));
|
||||||
|
|
||||||
public RemoteJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient) {
|
public RemoteJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageClient) {
|
||||||
super(apiUsageStateService, apiUsageClient);
|
super(apiUsageStateClient, apiUsageClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(fixedDelayString = "${js.remote.stats.print_interval_ms}")
|
@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.ListenableFuture;
|
||||||
import com.google.common.util.concurrent.MoreExecutors;
|
import com.google.common.util.concurrent.MoreExecutors;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.StringUtils;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
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
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* 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.Futures;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
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.ApiUsageRecordKey;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
@ -43,8 +44,8 @@ import static java.lang.String.format;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public abstract class AbstractJsInvokeService implements JsInvokeService {
|
public abstract class AbstractJsInvokeService implements JsInvokeService {
|
||||||
|
|
||||||
private final TbApiUsageStateService apiUsageStateService;
|
private final Optional<TbApiUsageStateClient> apiUsageStateClient;
|
||||||
private final TbApiUsageClient apiUsageClient;
|
private final Optional<TbApiUsageReportClient> apiUsageReportClient;
|
||||||
protected ScheduledExecutorService timeoutExecutorService;
|
protected ScheduledExecutorService timeoutExecutorService;
|
||||||
protected Map<UUID, String> scriptIdToNameMap = new ConcurrentHashMap<>();
|
protected Map<UUID, String> scriptIdToNameMap = new ConcurrentHashMap<>();
|
||||||
protected Map<UUID, DisableListInfo> disabledFunctions = 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}")
|
@Value("${js.max_script_body_size:50000}")
|
||||||
private long maxScriptBodySize;
|
private long maxScriptBodySize;
|
||||||
|
|
||||||
protected AbstractJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient) {
|
protected AbstractJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageReportClient) {
|
||||||
this.apiUsageStateService = apiUsageStateService;
|
this.apiUsageStateClient = apiUsageStateClient;
|
||||||
this.apiUsageClient = apiUsageClient;
|
this.apiUsageReportClient = apiUsageReportClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init(long maxRequestsTimeout) {
|
public void init(long maxRequestsTimeout) {
|
||||||
@ -78,7 +79,7 @@ public abstract class AbstractJsInvokeService implements JsInvokeService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<UUID> eval(TenantId tenantId, JsScriptType scriptType, String scriptBody, String... argNames) {
|
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)) {
|
if (scriptBodySizeExceeded(scriptBody)) {
|
||||||
return error(format("Script body exceeds maximum allowed size of %s symbols", getMaxScriptBodySize()));
|
return error(format("Script body exceeds maximum allowed size of %s symbols", getMaxScriptBodySize()));
|
||||||
}
|
}
|
||||||
@ -93,7 +94,7 @@ public abstract class AbstractJsInvokeService implements JsInvokeService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<String> invokeFunction(TenantId tenantId, CustomerId customerId, UUID scriptId, Object... args) {
|
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);
|
String functionName = scriptIdToNameMap.get(scriptId);
|
||||||
if (functionName == null) {
|
if (functionName == null) {
|
||||||
return error("No compiled script found for scriptId: [" + scriptId + "]!");
|
return error("No compiled script found for scriptId: [" + scriptId + "]!");
|
||||||
@ -102,7 +103,7 @@ public abstract class AbstractJsInvokeService implements JsInvokeService {
|
|||||||
if (argsSizeExceeded(args)) {
|
if (argsSizeExceeded(args)) {
|
||||||
return scriptExecutionError(scriptId, format("Script input arguments exceed maximum allowed total args size of %s symbols", getMaxTotalArgsSize()));
|
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 -> {
|
return Futures.transformAsync(doInvokeFunction(scriptId, functionName, args), output -> {
|
||||||
String result = output.toString();
|
String result = output.toString();
|
||||||
if (resultSizeExceeded(result)) {
|
if (resultSizeExceeded(result)) {
|
||||||
@ -13,11 +13,12 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* 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.FutureCallback;
|
||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import com.google.common.util.concurrent.ListeningExecutorService;
|
||||||
import com.google.common.util.concurrent.MoreExecutors;
|
import com.google.common.util.concurrent.MoreExecutors;
|
||||||
import delight.nashornsandbox.NashornSandbox;
|
import delight.nashornsandbox.NashornSandbox;
|
||||||
import delight.nashornsandbox.NashornSandboxes;
|
import delight.nashornsandbox.NashornSandboxes;
|
||||||
@ -26,8 +27,8 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.thingsboard.common.util.ThingsBoardExecutors;
|
import org.thingsboard.common.util.ThingsBoardExecutors;
|
||||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
@ -35,6 +36,7 @@ import javax.script.Invocable;
|
|||||||
import javax.script.ScriptEngine;
|
import javax.script.ScriptEngine;
|
||||||
import javax.script.ScriptEngineManager;
|
import javax.script.ScriptEngineManager;
|
||||||
import javax.script.ScriptException;
|
import javax.script.ScriptException;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
@ -49,6 +51,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
|||||||
private NashornSandbox sandbox;
|
private NashornSandbox sandbox;
|
||||||
private ScriptEngine engine;
|
private ScriptEngine engine;
|
||||||
private ExecutorService monitorExecutorService;
|
private ExecutorService monitorExecutorService;
|
||||||
|
private ListeningExecutorService jsExecutor;
|
||||||
|
|
||||||
private final AtomicInteger jsPushedMsgs = new AtomicInteger(0);
|
private final AtomicInteger jsPushedMsgs = new AtomicInteger(0);
|
||||||
private final AtomicInteger jsInvokeMsgs = 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();
|
private final ReentrantLock evalLock = new ReentrantLock();
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final JsExecutorService jsExecutor;
|
|
||||||
|
|
||||||
@Value("${js.local.max_requests_timeout:0}")
|
@Value("${js.local.max_requests_timeout:0}")
|
||||||
private long maxRequestsTimeout;
|
private long maxRequestsTimeout;
|
||||||
|
|
||||||
@Value("${js.local.stats.enabled:false}")
|
@Value("${js.local.stats.enabled:false}")
|
||||||
private boolean statsEnabled;
|
private boolean statsEnabled;
|
||||||
|
|
||||||
public AbstractNashornJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient, JsExecutorService jsExecutor) {
|
@Value("${js.local.js_thread_pool_size:50}")
|
||||||
super(apiUsageStateService, apiUsageClient);
|
private int jsExecutorThreadPoolSize;
|
||||||
this.jsExecutor = jsExecutor;
|
|
||||||
|
public AbstractNashornJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageReportClient) {
|
||||||
|
super(apiUsageStateClient, apiUsageReportClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(fixedDelayString = "${js.local.stats.print_interval_ms:10000}")
|
@Scheduled(fixedDelayString = "${js.local.stats.print_interval_ms:10000}")
|
||||||
@ -92,6 +94,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
|||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() {
|
public void init() {
|
||||||
super.init(maxRequestsTimeout);
|
super.init(maxRequestsTimeout);
|
||||||
|
jsExecutor = MoreExecutors.listeningDecorator(Executors.newWorkStealingPool(jsExecutorThreadPoolSize));
|
||||||
if (useJsSandbox()) {
|
if (useJsSandbox()) {
|
||||||
sandbox = NashornSandboxes.create();
|
sandbox = NashornSandboxes.create();
|
||||||
monitorExecutorService = ThingsBoardExecutors.newWorkStealingPool(getMonitorThreadPoolSize(), "nashorn-js-monitor");
|
monitorExecutorService = ThingsBoardExecutors.newWorkStealingPool(getMonitorThreadPoolSize(), "nashorn-js-monitor");
|
||||||
@ -123,7 +126,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
|||||||
@Override
|
@Override
|
||||||
protected ListenableFuture<UUID> doEval(UUID scriptId, String functionName, String jsScript) {
|
protected ListenableFuture<UUID> doEval(UUID scriptId, String functionName, String jsScript) {
|
||||||
jsPushedMsgs.incrementAndGet();
|
jsPushedMsgs.incrementAndGet();
|
||||||
ListenableFuture<UUID> result = jsExecutor.executeAsync(() -> {
|
ListenableFuture<UUID> result = jsExecutor.submit(() -> {
|
||||||
try {
|
try {
|
||||||
evalLock.lock();
|
evalLock.lock();
|
||||||
try {
|
try {
|
||||||
@ -152,7 +155,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer
|
|||||||
@Override
|
@Override
|
||||||
protected ListenableFuture<Object> doInvokeFunction(UUID scriptId, String functionName, Object[] args) {
|
protected ListenableFuture<Object> doInvokeFunction(UUID scriptId, String functionName, Object[] args) {
|
||||||
jsPushedMsgs.incrementAndGet();
|
jsPushedMsgs.incrementAndGet();
|
||||||
ListenableFuture<Object> result = jsExecutor.executeAsync(() -> {
|
ListenableFuture<Object> result = jsExecutor.submit(() -> {
|
||||||
try {
|
try {
|
||||||
if (useJsSandbox()) {
|
if (useJsSandbox()) {
|
||||||
return sandbox.getSandboxedInvocable().invokeFunction(functionName, args);
|
return sandbox.getSandboxedInvocable().invokeFunction(functionName, args);
|
||||||
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.script;
|
package org.thingsboard.script.api;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.script;
|
package org.thingsboard.script.api;
|
||||||
|
|
||||||
public enum JsScriptType {
|
public enum JsScriptType {
|
||||||
RULE_NODE_SCRIPT
|
RULE_NODE_SCRIPT
|
||||||
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* 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.FutureCallback;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -13,16 +13,17 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.script;
|
package org.thingsboard.script.api;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
import org.thingsboard.server.common.stats.TbApiUsageStateClient;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -48,8 +49,8 @@ public class NashornJsInvokeService extends AbstractNashornJsInvokeService {
|
|||||||
@Value("${js.local.max_black_list_duration_sec:60}")
|
@Value("${js.local.max_black_list_duration_sec:60}")
|
||||||
private int maxBlackListDurationSec;
|
private int maxBlackListDurationSec;
|
||||||
|
|
||||||
public NashornJsInvokeService(TbApiUsageStateService apiUsageStateService, TbApiUsageClient apiUsageClient, JsExecutorService jsExecutor) {
|
public NashornJsInvokeService(Optional<TbApiUsageStateClient> apiUsageStateClient, Optional<TbApiUsageReportClient> apiUsageReportClient) {
|
||||||
super(apiUsageStateService, apiUsageClient, jsExecutor);
|
super(apiUsageStateClient, apiUsageReportClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.script;
|
package org.thingsboard.script.api;
|
||||||
|
|
||||||
public class RuleNodeScriptFactory {
|
public class RuleNodeScriptFactory {
|
||||||
|
|
||||||
@ -13,17 +13,16 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* 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;
|
||||||
|
|
||||||
/**
|
public interface TbApiUsageReportClient {
|
||||||
* Created by ashvayka on 25.09.18.
|
|
||||||
*/
|
|
||||||
public class JsInvokeResponse {
|
|
||||||
|
|
||||||
private String scriptId;
|
void report(TenantId tenantId, CustomerId customerId, ApiUsageRecordKey key, long value);
|
||||||
private String scriptBody;
|
|
||||||
private List<String> args;
|
void report(TenantId tenantId, CustomerId customerId, ApiUsageRecordKey key);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -13,17 +13,13 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* 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;
|
||||||
|
|
||||||
/**
|
public interface TbApiUsageStateClient {
|
||||||
* Created by ashvayka on 25.09.18.
|
|
||||||
*/
|
|
||||||
public class JsInvokeRequest {
|
|
||||||
|
|
||||||
private String scriptId;
|
ApiUsageState getApiUsageState(TenantId tenantId);
|
||||||
private String scriptBody;
|
|
||||||
private List<String> args;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -94,7 +94,7 @@ import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
|||||||
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
|
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
|
||||||
import org.thingsboard.server.queue.provider.TbTransportQueueFactory;
|
import org.thingsboard.server.queue.provider.TbTransportQueueFactory;
|
||||||
import org.thingsboard.server.queue.scheduler.SchedulerComponent;
|
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.AfterStartUp;
|
||||||
import org.thingsboard.server.queue.util.TbTransportComponent;
|
import org.thingsboard.server.queue.util.TbTransportComponent;
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ public class DefaultTransportService implements TransportService {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Lazy
|
@Lazy
|
||||||
private TbApiUsageClient apiUsageClient;
|
private TbApiUsageReportClient apiUsageClient;
|
||||||
private final Map<String, Number> statsMap = new LinkedHashMap<>();
|
private final Map<String, Number> statsMap = new LinkedHashMap<>();
|
||||||
|
|
||||||
private final Gson gson = new Gson();
|
private final Gson gson = new Gson();
|
||||||
|
|||||||
10
pom.xml
10
pom.xml
@ -969,6 +969,16 @@
|
|||||||
<artifactId>coap-server</artifactId>
|
<artifactId>coap-server</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</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>
|
<dependency>
|
||||||
<groupId>org.thingsboard</groupId>
|
<groupId>org.thingsboard</groupId>
|
||||||
<artifactId>tools</artifactId>
|
<artifactId>tools</artifactId>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user