Merge branch 'develop/3.5' of github.com:thingsboard/thingsboard into feature/home-page
This commit is contained in:
commit
07504aad2b
@ -84,6 +84,8 @@ public class TbWebSocketHandler extends TextWebSocketHandler implements WebSocke
|
|||||||
private long sendTimeout;
|
private long sendTimeout;
|
||||||
@Value("${server.ws.ping_timeout:30000}")
|
@Value("${server.ws.ping_timeout:30000}")
|
||||||
private long pingTimeout;
|
private long pingTimeout;
|
||||||
|
@Value("${server.ws.max_queue_messages_per_session:1000}")
|
||||||
|
private int wsMaxQueueMessagesPerSession;
|
||||||
|
|
||||||
private final ConcurrentMap<String, WebSocketSessionRef> blacklistedSessions = new ConcurrentHashMap<>();
|
private final ConcurrentMap<String, WebSocketSessionRef> blacklistedSessions = new ConcurrentHashMap<>();
|
||||||
private final ConcurrentMap<String, TbRateLimits> perSessionUpdateLimits = new ConcurrentHashMap<>();
|
private final ConcurrentMap<String, TbRateLimits> perSessionUpdateLimits = new ConcurrentHashMap<>();
|
||||||
@ -143,9 +145,11 @@ public class TbWebSocketHandler extends TextWebSocketHandler implements WebSocke
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var tenantProfileConfiguration = getTenantProfileConfiguration(sessionRef);
|
var tenantProfileConfiguration = getTenantProfileConfiguration(sessionRef);
|
||||||
|
int wsTenantProfileQueueLimit = tenantProfileConfiguration != null ?
|
||||||
|
tenantProfileConfiguration.getWsMsgQueueLimitPerSession() : wsMaxQueueMessagesPerSession;
|
||||||
internalSessionMap.put(internalSessionId, new SessionMetaData(session, sessionRef,
|
internalSessionMap.put(internalSessionId, new SessionMetaData(session, sessionRef,
|
||||||
tenantProfileConfiguration != null && tenantProfileConfiguration.getWsMsgQueueLimitPerSession() > 0 ?
|
(wsTenantProfileQueueLimit > 0 && wsTenantProfileQueueLimit < wsMaxQueueMessagesPerSession) ?
|
||||||
tenantProfileConfiguration.getWsMsgQueueLimitPerSession() : 500));
|
wsTenantProfileQueueLimit : wsMaxQueueMessagesPerSession));
|
||||||
|
|
||||||
externalSessionMap.put(externalSessionId, internalSessionId);
|
externalSessionMap.put(externalSessionId, internalSessionId);
|
||||||
processInWebSocketService(sessionRef, SessionEvent.onEstablished());
|
processInWebSocketService(sessionRef, SessionEvent.onEstablished());
|
||||||
|
|||||||
@ -20,7 +20,6 @@ import ua_parser.Client;
|
|||||||
import ua_parser.Parser;
|
import ua_parser.Parser;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -43,11 +42,7 @@ public class RestAuthenticationDetails implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Client getUserAgent(HttpServletRequest request) {
|
private static Client getUserAgent(HttpServletRequest request) {
|
||||||
try {
|
Parser uaParser = new Parser();
|
||||||
Parser uaParser = new Parser();
|
return uaParser.parse(request.getHeader("User-Agent"));
|
||||||
return uaParser.parse(request.getHeader("User-Agent"));
|
|
||||||
} catch (IOException e) {
|
|
||||||
return new Client(null, null, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,6 +65,7 @@ server:
|
|||||||
max_per_user: "${TB_SERVER_WS_DYNAMIC_PAGE_LINK_MAX_PER_USER:10}"
|
max_per_user: "${TB_SERVER_WS_DYNAMIC_PAGE_LINK_MAX_PER_USER:10}"
|
||||||
max_entities_per_data_subscription: "${TB_SERVER_WS_MAX_ENTITIES_PER_DATA_SUBSCRIPTION:10000}"
|
max_entities_per_data_subscription: "${TB_SERVER_WS_MAX_ENTITIES_PER_DATA_SUBSCRIPTION:10000}"
|
||||||
max_entities_per_alarm_subscription: "${TB_SERVER_WS_MAX_ENTITIES_PER_ALARM_SUBSCRIPTION:10000}"
|
max_entities_per_alarm_subscription: "${TB_SERVER_WS_MAX_ENTITIES_PER_ALARM_SUBSCRIPTION:10000}"
|
||||||
|
max_queue_messages_per_session: "${TB_SERVER_WS_DEFAULT_QUEUE_MESSAGES_PER_SESSION:1000}"
|
||||||
rest:
|
rest:
|
||||||
server_side_rpc:
|
server_side_rpc:
|
||||||
# Minimum value of the server side RPC timeout. May override value provided in the REST API call.
|
# Minimum value of the server side RPC timeout. May override value provided in the REST API call.
|
||||||
|
|||||||
@ -100,6 +100,10 @@
|
|||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.swagger</groupId>
|
<groupId>io.swagger</groupId>
|
||||||
<artifactId>swagger-annotations</artifactId>
|
<artifactId>swagger-annotations</artifactId>
|
||||||
|
|||||||
@ -20,7 +20,6 @@ import com.google.common.util.concurrent.ListenableFuture;
|
|||||||
import com.google.common.util.concurrent.MoreExecutors;
|
import com.google.common.util.concurrent.MoreExecutors;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
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.boot.autoconfigure.condition.ConditionalOnExpression;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||||
@ -191,7 +190,6 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
|
|||||||
}, callbackExecutor);
|
}, callbackExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private JsInvokeProtos.RemoteJsRequest buildJsInvokeRequest(JsScriptInfo jsInfo, Object[] args, boolean includeScriptBody, String scriptBody) {
|
private JsInvokeProtos.RemoteJsRequest buildJsInvokeRequest(JsScriptInfo jsInfo, Object[] args, boolean includeScriptBody, String scriptBody) {
|
||||||
JsInvokeProtos.JsInvokeRequest.Builder jsRequestBuilder = JsInvokeProtos.JsInvokeRequest.newBuilder()
|
JsInvokeProtos.JsInvokeRequest.Builder jsRequestBuilder = JsInvokeProtos.JsInvokeRequest.newBuilder()
|
||||||
.setScriptHash(jsInfo.getHash())
|
.setScriptHash(jsInfo.getHash())
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import org.thingsboard.server.common.data.id.TenantId;
|
|||||||
import org.thingsboard.server.common.data.queue.ProcessingStrategy;
|
import org.thingsboard.server.common.data.queue.ProcessingStrategy;
|
||||||
import org.thingsboard.server.common.data.queue.SubmitStrategy;
|
import org.thingsboard.server.common.data.queue.SubmitStrategy;
|
||||||
import org.thingsboard.server.common.data.queue.SubmitStrategyType;
|
import org.thingsboard.server.common.data.queue.SubmitStrategyType;
|
||||||
|
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
|
||||||
import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration;
|
import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration;
|
||||||
import org.thingsboard.server.dao.exception.DataValidationException;
|
import org.thingsboard.server.dao.exception.DataValidationException;
|
||||||
import org.thingsboard.server.dao.service.DataValidator;
|
import org.thingsboard.server.dao.service.DataValidator;
|
||||||
|
|||||||
@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.alarm;
|
|||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
@ -303,7 +302,6 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
|
|||||||
return alarmQueryRepository.countAlarmsByQuery(tenantId, customerId, query);
|
return alarmQueryRepository.countAlarmsByQuery(tenantId, customerId, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static String getPropagationTypes(AlarmPropagationInfo ap) {
|
private static String getPropagationTypes(AlarmPropagationInfo ap) {
|
||||||
String propagateRelationTypes;
|
String propagateRelationTypes;
|
||||||
if (!CollectionUtils.isEmpty(ap.getPropagateRelationTypes())) {
|
if (!CollectionUtils.isEmpty(ap.getPropagateRelationTypes())) {
|
||||||
|
|||||||
24
pom.xml
24
pom.xml
@ -39,13 +39,13 @@
|
|||||||
<javax-annotation.version>1.3.2</javax-annotation.version>
|
<javax-annotation.version>1.3.2</javax-annotation.version>
|
||||||
<jakarta.xml.bind-api.version>2.3.2</jakarta.xml.bind-api.version>
|
<jakarta.xml.bind-api.version>2.3.2</jakarta.xml.bind-api.version>
|
||||||
<jaxb-runtime.version>2.3.2</jaxb-runtime.version>
|
<jaxb-runtime.version>2.3.2</jaxb-runtime.version>
|
||||||
<spring-boot.version>2.7.0</spring-boot.version>
|
<spring-boot.version>2.7.10</spring-boot.version>
|
||||||
<spring-data.version>2.7.0</spring-data.version>
|
<spring-data.version>2.7.10</spring-data.version>
|
||||||
<spring.version>5.3.20</spring.version>
|
<spring.version>5.3.26</spring.version>
|
||||||
<spring-redis.version>5.5.12</spring-redis.version>
|
<spring-redis.version>5.5.17</spring-redis.version>
|
||||||
<spring-security.version>5.7.1</spring-security.version>
|
<spring-security.version>5.7.7</spring-security.version>
|
||||||
<spring-data-redis.version>2.7.0</spring-data-redis.version>
|
<spring-data-redis.version>2.7.10</spring-data-redis.version>
|
||||||
<jedis.version>3.7.1</jedis.version>
|
<jedis.version>3.8.0</jedis.version>
|
||||||
<jjwt.version>0.7.0</jjwt.version>
|
<jjwt.version>0.7.0</jjwt.version>
|
||||||
<slf4j.version>1.7.32</slf4j.version>
|
<slf4j.version>1.7.32</slf4j.version>
|
||||||
<log4j.version>2.17.1</log4j.version>
|
<log4j.version>2.17.1</log4j.version>
|
||||||
@ -75,14 +75,14 @@
|
|||||||
<freemarker.version>2.3.30</freemarker.version>
|
<freemarker.version>2.3.30</freemarker.version>
|
||||||
<mail.version>1.6.2</mail.version>
|
<mail.version>1.6.2</mail.version>
|
||||||
<curator.version>4.2.0</curator.version>
|
<curator.version>4.2.0</curator.version>
|
||||||
<zookeeper.version>3.5.5</zookeeper.version>
|
<zookeeper.version>3.8.1</zookeeper.version>
|
||||||
<protobuf.version>3.21.9</protobuf.version>
|
<protobuf.version>3.21.9</protobuf.version>
|
||||||
<grpc.version>1.42.1</grpc.version>
|
<grpc.version>1.42.1</grpc.version>
|
||||||
<tbel.version>1.0.6</tbel.version>
|
<tbel.version>1.0.6</tbel.version>
|
||||||
<lombok.version>1.18.18</lombok.version>
|
<lombok.version>1.18.18</lombok.version>
|
||||||
<paho.client.version>1.2.4</paho.client.version>
|
<paho.client.version>1.2.4</paho.client.version>
|
||||||
<paho.mqttv5.client.version>1.2.5</paho.mqttv5.client.version>
|
<paho.mqttv5.client.version>1.2.5</paho.mqttv5.client.version>
|
||||||
<netty.version>4.1.75.Final</netty.version>
|
<netty.version>4.1.91.Final</netty.version>
|
||||||
<netty-tcnative.version>2.0.51.Final</netty-tcnative.version>
|
<netty-tcnative.version>2.0.51.Final</netty-tcnative.version>
|
||||||
<os-maven-plugin.version>1.7.0</os-maven-plugin.version>
|
<os-maven-plugin.version>1.7.0</os-maven-plugin.version>
|
||||||
<rabbitmq.version>4.8.0</rabbitmq.version>
|
<rabbitmq.version>4.8.0</rabbitmq.version>
|
||||||
@ -107,13 +107,13 @@
|
|||||||
<bucket4j.version>4.1.1</bucket4j.version>
|
<bucket4j.version>4.1.1</bucket4j.version>
|
||||||
<fst.version>2.57</fst.version>
|
<fst.version>2.57</fst.version>
|
||||||
<antlr.version>2.7.7</antlr.version>
|
<antlr.version>2.7.7</antlr.version>
|
||||||
<snakeyaml.version>1.27</snakeyaml.version>
|
<snakeyaml.version>2.0</snakeyaml.version>
|
||||||
<aws.sdk.version>1.11.747</aws.sdk.version>
|
<aws.sdk.version>1.11.747</aws.sdk.version>
|
||||||
<pubsub.client.version>1.105.0</pubsub.client.version>
|
<pubsub.client.version>1.105.0</pubsub.client.version>
|
||||||
<google.common.protos.version>2.1.0</google.common.protos.version> <!-- required by io.grpc:grpc-protobuf:1.38.0-->
|
<google.common.protos.version>2.1.0</google.common.protos.version> <!-- required by io.grpc:grpc-protobuf:1.38.0-->
|
||||||
<azure-servicebus.version>3.2.0</azure-servicebus.version>
|
<azure-servicebus.version>3.2.0</azure-servicebus.version>
|
||||||
<passay.version>1.5.0</passay.version>
|
<passay.version>1.5.0</passay.version>
|
||||||
<ua-parser.version>1.4.3</ua-parser.version>
|
<ua-parser.version>1.5.4</ua-parser.version>
|
||||||
<commons-beanutils.version>1.9.4</commons-beanutils.version>
|
<commons-beanutils.version>1.9.4</commons-beanutils.version>
|
||||||
<commons-collections.version>3.2.2</commons-collections.version>
|
<commons-collections.version>3.2.2</commons-collections.version>
|
||||||
<micrometer.version>1.9.0</micrometer.version>
|
<micrometer.version>1.9.0</micrometer.version>
|
||||||
@ -123,7 +123,7 @@
|
|||||||
<hibernate-validator.version>6.0.20.Final</hibernate-validator.version>
|
<hibernate-validator.version>6.0.20.Final</hibernate-validator.version>
|
||||||
<javax.el.version>3.0.0</javax.el.version>
|
<javax.el.version>3.0.0</javax.el.version>
|
||||||
<javax.validation-api.version>2.0.1.Final</javax.validation-api.version>
|
<javax.validation-api.version>2.0.1.Final</javax.validation-api.version>
|
||||||
<antisamy.version>1.6.8</antisamy.version>
|
<antisamy.version>1.7.2</antisamy.version>
|
||||||
<snmp4j.version>2.8.5</snmp4j.version>
|
<snmp4j.version>2.8.5</snmp4j.version>
|
||||||
<!-- TEST SCOPE -->
|
<!-- TEST SCOPE -->
|
||||||
<awaitility.version>4.1.0</awaitility.version>
|
<awaitility.version>4.1.0</awaitility.version>
|
||||||
|
|||||||
@ -21,7 +21,6 @@ import com.google.gson.JsonElement;
|
|||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.thingsboard.server.common.data.util.CollectionsUtil;
|
import org.thingsboard.server.common.data.util.CollectionsUtil;
|
||||||
import org.thingsboard.common.util.DonAsynchron;
|
import org.thingsboard.common.util.DonAsynchron;
|
||||||
import org.thingsboard.rule.engine.api.EmptyNodeConfiguration;
|
import org.thingsboard.rule.engine.api.EmptyNodeConfiguration;
|
||||||
@ -127,7 +126,6 @@ public class TbCopyAttributesToEntityViewNode implements TbNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private FutureCallback<Void> getFutureCallback(TbContext ctx, TbMsg msg, EntityView entityView) {
|
private FutureCallback<Void> getFutureCallback(TbContext ctx, TbMsg msg, EntityView entityView) {
|
||||||
return new FutureCallback<Void>() {
|
return new FutureCallback<Void>() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
|
|||||||
type = ComponentType.FILTER,
|
type = ComponentType.FILTER,
|
||||||
name = "entity type switch",
|
name = "entity type switch",
|
||||||
configClazz = EmptyNodeConfiguration.class,
|
configClazz = EmptyNodeConfiguration.class,
|
||||||
relationTypes = {"Device", "Asset", "Alarm", "Entity View", "Tenant", "Customer", "User", "Dashboard", "Rule chain", "Rule node"},
|
relationTypes = {"Device", "Asset", "Alarm", "Entity View", "Tenant", "Customer", "User", "Dashboard", "Rule chain", "Rule node", "Edge"},
|
||||||
nodeDescription = "Route incoming messages by Message Originator Type",
|
nodeDescription = "Route incoming messages by Message Originator Type",
|
||||||
nodeDetails = "Routes messages to chain according to the entity type ('Device', 'Asset', etc.).",
|
nodeDetails = "Routes messages to chain according to the entity type ('Device', 'Asset', etc.).",
|
||||||
uiResources = {"static/rulenode/rulenode-core-config.js"},
|
uiResources = {"static/rulenode/rulenode-core-config.js"},
|
||||||
|
|||||||
@ -410,6 +410,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('wsMsgQueueLimitPerSession').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('wsMsgQueueLimitPerSession').hasError('min')">
|
||||||
{{ 'tenant-profile.too-small-value-one' | translate}}
|
{{ 'tenant-profile.too-small-value-one' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint>
|
||||||
|
{{ 'tenant-profile.queue-size-is-limited-by-system-configuration' | translate}}
|
||||||
|
</mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<div fxFlex></div>
|
<div fxFlex></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -3602,6 +3602,7 @@
|
|||||||
"incorrect-pattern-for-rate-limits": "The format is comma separated pairs of capacity and period (in seconds) with a colon between, e.g. 100:1,2000:60",
|
"incorrect-pattern-for-rate-limits": "The format is comma separated pairs of capacity and period (in seconds) with a colon between, e.g. 100:1,2000:60",
|
||||||
"too-small-value-zero": "The value must be bigger than 0",
|
"too-small-value-zero": "The value must be bigger than 0",
|
||||||
"too-small-value-one": "The value must be bigger than 1",
|
"too-small-value-one": "The value must be bigger than 1",
|
||||||
|
"queue-size-is-limited-by-system-configuration": "The size of the queue is also limited by the system configuration.",
|
||||||
"cassandra-tenant-limits-configuration": "Cassandra query for tenant",
|
"cassandra-tenant-limits-configuration": "Cassandra query for tenant",
|
||||||
"ws-limit-max-sessions-per-tenant": "Sessions per tenant maximum number",
|
"ws-limit-max-sessions-per-tenant": "Sessions per tenant maximum number",
|
||||||
"ws-limit-max-sessions-per-customer": "Sessions per customer maximum number",
|
"ws-limit-max-sessions-per-customer": "Sessions per customer maximum number",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user