diff --git a/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java b/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java index 69061ba410..50949c1578 100644 --- a/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java +++ b/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java @@ -99,7 +99,7 @@ public class DefaultActorService implements ActorService { @PostConstruct public void initActorSystem() { - log.info("Initializing Actor system. {}", actorContext.getRuleChainService()); + log.info("Initializing Actor system."); actorContext.setActorService(this); system = ActorSystem.create(ACTOR_SYSTEM_NAME, actorContext.getConfig()); actorContext.setActorSystem(system); diff --git a/application/src/main/java/org/thingsboard/server/controller/plugin/TbWebSocketHandler.java b/application/src/main/java/org/thingsboard/server/controller/plugin/TbWebSocketHandler.java index c0a3ee7803..ebd068dae5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/plugin/TbWebSocketHandler.java +++ b/application/src/main/java/org/thingsboard/server/controller/plugin/TbWebSocketHandler.java @@ -263,7 +263,7 @@ public class TbWebSocketHandler extends TextWebSocketHandler implements Telemetr if (regularUserSessions.size() < maxSessionsPerRegularUser) { regularUserSessions.add(sessionId); } else { - log.info("[{}][{}][{}] Failed to start session. Max user sessions limit reached" + log.info("[{}][{}][{}] Failed to start session. Max regular user sessions limit reached" , sessionRef.getSecurityCtx().getTenantId(), sessionRef.getSecurityCtx().getId(), sessionId); session.close(CloseStatus.POLICY_VIOLATION.withReason("Max regular user sessions limit reached")); return false; @@ -276,7 +276,7 @@ public class TbWebSocketHandler extends TextWebSocketHandler implements Telemetr if (publicUserSessions.size() < maxSessionsPerPublicUser) { publicUserSessions.add(sessionId); } else { - log.info("[{}][{}][{}] Failed to start session. Max user sessions limit reached" + log.info("[{}][{}][{}] Failed to start session. Max public user sessions limit reached" , sessionRef.getSecurityCtx().getTenantId(), sessionRef.getSecurityCtx().getId(), sessionId); session.close(CloseStatus.POLICY_VIOLATION.withReason("Max public user sessions limit reached")); return false; diff --git a/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java b/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java index 89ecc9b910..683a8c504f 100644 --- a/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java +++ b/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java @@ -266,7 +266,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi } else if (customerSessions.size() < maxSubscriptionsPerCustomer) { customerSessions.add(subId); } else { - log.info("[{}][{}][{}] Failed to start subscription. Max customer sessions limit reached" + log.info("[{}][{}][{}] Failed to start subscription. Max customer subscriptions limit reached" , sessionRef.getSecurityCtx().getTenantId(), sessionRef.getSecurityCtx().getId(), subId); msgEndpoint.close(sessionRef, CloseStatus.POLICY_VIOLATION.withReason("Max customer subscriptions limit reached")); return false; @@ -279,7 +279,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi if (regularUserSessions.size() < maxSubscriptionsPerRegularUser) { regularUserSessions.add(subId); } else { - log.info("[{}][{}][{}] Failed to start subscription. Max user sessions limit reached" + log.info("[{}][{}][{}] Failed to start subscription. Max regular user subscriptions limit reached" , sessionRef.getSecurityCtx().getTenantId(), sessionRef.getSecurityCtx().getId(), subId); msgEndpoint.close(sessionRef, CloseStatus.POLICY_VIOLATION.withReason("Max regular user subscriptions limit reached")); return false; @@ -292,7 +292,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi if (publicUserSessions.size() < maxSubscriptionsPerPublicUser) { publicUserSessions.add(subId); } else { - log.info("[{}][{}][{}] Failed to start subscription. Max user sessions limit reached" + log.info("[{}][{}][{}] Failed to start subscription. Max public user subscriptions limit reached" , sessionRef.getSecurityCtx().getTenantId(), sessionRef.getSecurityCtx().getId(), subId); msgEndpoint.close(sessionRef, CloseStatus.POLICY_VIOLATION.withReason("Max public user subscriptions limit reached")); return false; diff --git a/ui/src/app/api/telemetry-websocket.service.js b/ui/src/app/api/telemetry-websocket.service.js index 3e08e60cc1..67dec544b9 100644 --- a/ui/src/app/api/telemetry-websocket.service.js +++ b/ui/src/app/api/telemetry-websocket.service.js @@ -26,7 +26,7 @@ const WS_IDLE_TIMEOUT = 90000; const MAX_PUBLISH_COMMANDS = 10; /*@ngInject*/ -function TelemetryWebsocketService($rootScope, $websocket, $timeout, $window, types, userService) { +function TelemetryWebsocketService($rootScope, $websocket, $timeout, $window, $mdUtil, toast, types, userService) { var isOpening = false, isOpened = false, @@ -111,7 +111,10 @@ function TelemetryWebsocketService($rootScope, $websocket, $timeout, $window, ty } } - function onError (/*message*/) { + function onError (errorEvent) { + if (errorEvent) { + showWsError(0, errorEvent); + } isOpening = false; } @@ -137,7 +140,10 @@ function TelemetryWebsocketService($rootScope, $websocket, $timeout, $window, ty } } - function onClose () { + function onClose (closeEvent) { + if (closeEvent && closeEvent.code > 1000 && closeEvent.code !== 1006) { + showWsError(closeEvent.code, closeEvent.reason); + } isOpening = false; isOpened = false; if (isActive) { @@ -162,7 +168,9 @@ function TelemetryWebsocketService($rootScope, $websocket, $timeout, $window, ty function onMessage (message) { if (message.data) { var data = angular.fromJson(message.data); - if (data.subscriptionId) { + if (data.errorCode) { + showWsError(data.errorCode, data.errorMsg); + } else if (data.subscriptionId) { var subscriber = subscribers[data.subscriptionId]; if (subscriber && data) { var keys = fetchKeys(data.subscriptionId); @@ -182,6 +190,18 @@ function TelemetryWebsocketService($rootScope, $websocket, $timeout, $window, ty checkToClose(); } + function showWsError(errorCode, errorMsg) { + var message = 'WebSocket Error: '; + if (errorMsg) { + message += errorMsg; + } else { + message += "error code - " + errorCode + "."; + } + $mdUtil.nextTick(function () { + toast.showError(message); + }); + } + function fetchKeys(subscriptionId) { var command = commands[subscriptionId]; if (command && command.keys && command.keys.length > 0) { diff --git a/ui/src/app/common/types.constant.js b/ui/src/app/common/types.constant.js index 506ef1d9b6..bbfca60f94 100644 --- a/ui/src/app/common/types.constant.js +++ b/ui/src/app/common/types.constant.js @@ -23,7 +23,9 @@ export default angular.module('thingsboard.types', []) permissionDenied: 20, invalidArguments: 30, badRequestParams: 31, - itemNotFound: 32 + itemNotFound: 32, + tooManyRequests: 33, + tooManyUpdates: 34 }, entryPoints: { login: "/api/auth/login", diff --git a/ui/src/app/services/toast.scss b/ui/src/app/services/toast.scss index 952a42d855..cea79d00f7 100644 --- a/ui/src/app/services/toast.scss +++ b/ui/src/app/services/toast.scss @@ -16,18 +16,21 @@ md-toast.tb-info-toast .md-toast-content { height: 100%; + max-height: 100%; padding: 18px; font-size: 18px; } md-toast.tb-success-toast .md-toast-content { height: 100%; + max-height: 100%; font-size: 18px !important; background-color: #008000; } md-toast.tb-error-toast .md-toast-content { height: 100%; + max-height: 100%; font-size: 18px !important; background-color: #800000; }