From 82f9eed985466340efa83a05060262e18c1ba2c2 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 5 Jul 2022 17:22:11 +0300 Subject: [PATCH 01/10] Add handling of failed remote js responses. Do not block script due to timeout message because of queue connectivity --- .../service/script/RemoteJsInvokeService.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index 3bee5ca720..27ee22e459 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -192,14 +192,33 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TbProtoQueueMsg result) { - queueInvokeMsgs.incrementAndGet(); + if (result == null) { + queueInvokeMsgs.incrementAndGet(); + } else { + JsInvokeProtos.JsInvokeResponse invokeResponse = result.getValue().getInvokeResponse(); + if (invokeResponse.getSuccess()) { + queueInvokeMsgs.incrementAndGet(); + } else { + JsInvokeProtos.JsInvokeErrorCode errorCode = invokeResponse.getErrorCode(); + final RuntimeException e = new RuntimeException(invokeResponse.getErrorDetails()); + onScriptExecutionError(scriptId, e, scriptBody); + if (JsInvokeProtos.JsInvokeErrorCode.TIMEOUT_ERROR.equals(errorCode)) { + queueTimeoutMsgs.incrementAndGet(); + queueFailedMsgs.incrementAndGet(); + } else if (JsInvokeProtos.JsInvokeErrorCode.COMPILATION_ERROR.equals(errorCode) + || JsInvokeProtos.JsInvokeErrorCode.RUNTIME_ERROR.equals(errorCode)) { + queueFailedMsgs.incrementAndGet(); + } + } + } } @Override public void onFailure(Throwable t) { - onScriptExecutionError(scriptId, t, scriptBody); if (t instanceof TimeoutException || (t.getCause() != null && t.getCause() instanceof TimeoutException)) { queueTimeoutMsgs.incrementAndGet(); + } else { + onScriptExecutionError(scriptId, t, scriptBody); } queueFailedMsgs.incrementAndGet(); } From a35f8b9a380ece27344b15878ebe4aae53d3eed7 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 5 Jul 2022 17:41:54 +0300 Subject: [PATCH 02/10] Code review updates --- .../service/script/RemoteJsInvokeService.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index 27ee22e459..3fda3df46e 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -192,23 +192,20 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TbProtoQueueMsg result) { - if (result == null) { - queueInvokeMsgs.incrementAndGet(); - } else { + if (result != null) { JsInvokeProtos.JsInvokeResponse invokeResponse = result.getValue().getInvokeResponse(); if (invokeResponse.getSuccess()) { queueInvokeMsgs.incrementAndGet(); } else { JsInvokeProtos.JsInvokeErrorCode errorCode = invokeResponse.getErrorCode(); final RuntimeException e = new RuntimeException(invokeResponse.getErrorDetails()); - onScriptExecutionError(scriptId, e, scriptBody); if (JsInvokeProtos.JsInvokeErrorCode.TIMEOUT_ERROR.equals(errorCode)) { + onScriptExecutionError(scriptId, e, scriptBody); queueTimeoutMsgs.incrementAndGet(); - queueFailedMsgs.incrementAndGet(); - } else if (JsInvokeProtos.JsInvokeErrorCode.COMPILATION_ERROR.equals(errorCode) - || JsInvokeProtos.JsInvokeErrorCode.RUNTIME_ERROR.equals(errorCode)) { - queueFailedMsgs.incrementAndGet(); + } else if (JsInvokeProtos.JsInvokeErrorCode.COMPILATION_ERROR.equals(errorCode)) { + onScriptExecutionError(scriptId, e, scriptBody); } + queueFailedMsgs.incrementAndGet(); } } } @@ -217,8 +214,6 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { public void onFailure(Throwable t) { if (t instanceof TimeoutException || (t.getCause() != null && t.getCause() instanceof TimeoutException)) { queueTimeoutMsgs.incrementAndGet(); - } else { - onScriptExecutionError(scriptId, t, scriptBody); } queueFailedMsgs.incrementAndGet(); } From 0c7f23260990dda5e41a586b99d39922192a4d03 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 7 Jul 2022 10:39:15 +0300 Subject: [PATCH 03/10] Code review updates - move result processing into transform method --- .../service/script/RemoteJsInvokeService.java | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index 3fda3df46e..a477ca9e80 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -192,22 +192,6 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TbProtoQueueMsg result) { - if (result != null) { - JsInvokeProtos.JsInvokeResponse invokeResponse = result.getValue().getInvokeResponse(); - if (invokeResponse.getSuccess()) { - queueInvokeMsgs.incrementAndGet(); - } else { - JsInvokeProtos.JsInvokeErrorCode errorCode = invokeResponse.getErrorCode(); - final RuntimeException e = new RuntimeException(invokeResponse.getErrorDetails()); - if (JsInvokeProtos.JsInvokeErrorCode.TIMEOUT_ERROR.equals(errorCode)) { - onScriptExecutionError(scriptId, e, scriptBody); - queueTimeoutMsgs.incrementAndGet(); - } else if (JsInvokeProtos.JsInvokeErrorCode.COMPILATION_ERROR.equals(errorCode)) { - onScriptExecutionError(scriptId, e, scriptBody); - } - queueFailedMsgs.incrementAndGet(); - } - } } @Override @@ -223,10 +207,18 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { log.trace("doInvokeFunction js-response took {}ms for uuid {}", stopWatch.getTotalTimeMillis(), response.getKey()); JsInvokeProtos.JsInvokeResponse invokeResult = response.getValue().getInvokeResponse(); if (invokeResult.getSuccess()) { + queueInvokeMsgs.incrementAndGet(); return invokeResult.getResult(); } else { final RuntimeException e = new RuntimeException(invokeResult.getErrorDetails()); - onScriptExecutionError(scriptId, e, scriptBody); + JsInvokeProtos.JsInvokeErrorCode errorCode = invokeResult.getErrorCode(); + if (JsInvokeProtos.JsInvokeErrorCode.TIMEOUT_ERROR.equals(errorCode)) { + onScriptExecutionError(scriptId, e, scriptBody); + queueTimeoutMsgs.incrementAndGet(); + } else if (JsInvokeProtos.JsInvokeErrorCode.COMPILATION_ERROR.equals(errorCode)) { + onScriptExecutionError(scriptId, e, scriptBody); + } + queueFailedMsgs.incrementAndGet(); log.debug("[{}] Failed to compile script due to [{}]: {}", scriptId, invokeResult.getErrorCode().name(), invokeResult.getErrorDetails()); throw e; } From 723194d946b44940d9df2a9a72c2895981f24126 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 7 Jul 2022 10:46:58 +0300 Subject: [PATCH 04/10] Updates for nashorn script processing. Code refactoring --- .../service/script/AbstractNashornJsInvokeService.java | 2 ++ .../server/service/script/RemoteJsInvokeService.java | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java index 6aac90b281..d731ef1536 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java @@ -159,6 +159,8 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer } else { return ((Invocable) engine).invokeFunction(functionName, args); } + } catch (ScriptException e) { + throw new ExecutionException(e); } catch (Exception e) { onScriptExecutionError(scriptId, e, functionName); throw new ExecutionException(e); diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index a477ca9e80..e92e36befd 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -211,15 +211,14 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { return invokeResult.getResult(); } else { final RuntimeException e = new RuntimeException(invokeResult.getErrorDetails()); - JsInvokeProtos.JsInvokeErrorCode errorCode = invokeResult.getErrorCode(); - if (JsInvokeProtos.JsInvokeErrorCode.TIMEOUT_ERROR.equals(errorCode)) { + if (JsInvokeProtos.JsInvokeErrorCode.TIMEOUT_ERROR.equals(invokeResult.getErrorCode())) { onScriptExecutionError(scriptId, e, scriptBody); queueTimeoutMsgs.incrementAndGet(); - } else if (JsInvokeProtos.JsInvokeErrorCode.COMPILATION_ERROR.equals(errorCode)) { + } else if (JsInvokeProtos.JsInvokeErrorCode.COMPILATION_ERROR.equals(invokeResult.getErrorCode())) { onScriptExecutionError(scriptId, e, scriptBody); } queueFailedMsgs.incrementAndGet(); - log.debug("[{}] Failed to compile script due to [{}]: {}", scriptId, invokeResult.getErrorCode().name(), invokeResult.getErrorDetails()); + log.debug("[{}] Failed to invoke function due to [{}]: {}", scriptId, invokeResult.getErrorCode().name(), invokeResult.getErrorDetails()); throw e; } }, callbackExecutor); From 21f6c58a89ed49d5185824daaad625e1e834b75b Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 7 Jul 2022 12:23:56 +0300 Subject: [PATCH 05/10] Invoke msg count fix --- .../server/service/script/RemoteJsInvokeService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index e92e36befd..addd39f39a 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -192,6 +192,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TbProtoQueueMsg result) { + queueInvokeMsgs.incrementAndGet(); } @Override @@ -207,7 +208,6 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { log.trace("doInvokeFunction js-response took {}ms for uuid {}", stopWatch.getTotalTimeMillis(), response.getKey()); JsInvokeProtos.JsInvokeResponse invokeResult = response.getValue().getInvokeResponse(); if (invokeResult.getSuccess()) { - queueInvokeMsgs.incrementAndGet(); return invokeResult.getResult(); } else { final RuntimeException e = new RuntimeException(invokeResult.getErrorDetails()); From 52b0d7e39e0ed7805a5e4958ca0db6eeaa5a8102 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 7 Jul 2022 13:10:29 +0300 Subject: [PATCH 06/10] Take into account queue transfer delay --- .../server/service/script/RemoteJsInvokeService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index addd39f39a..fad92fe217 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -51,6 +51,8 @@ import java.util.concurrent.atomic.AtomicInteger; @Service public class RemoteJsInvokeService extends AbstractJsInvokeService { + private static final int QUEUE_TRANSFER_DELAY = 2000; + @Value("${queue.js.max_eval_requests_timeout}") private long maxEvalRequestsTimeout; @@ -186,7 +188,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { ListenableFuture> future = requestTemplate.send(new TbProtoJsQueueMsg<>(UUID.randomUUID(), jsRequestWrapper)); if (maxRequestsTimeout > 0) { - future = Futures.withTimeout(future, maxRequestsTimeout, TimeUnit.MILLISECONDS, timeoutExecutorService); + future = Futures.withTimeout(future, maxRequestsTimeout + QUEUE_TRANSFER_DELAY, TimeUnit.MILLISECONDS, timeoutExecutorService); } queuePushedMsgs.incrementAndGet(); Futures.addCallback(future, new FutureCallback>() { From 5253705f458d2edf70e6b944d2e6760cfabe8feb Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 7 Jul 2022 17:52:14 +0300 Subject: [PATCH 07/10] Set default js timeout to 1500. Removed transfer delay - replace it by multiplier --- .../server/service/script/RemoteJsInvokeService.java | 6 ++---- application/src/main/resources/thingsboard.yml | 2 +- docker/tb-node.env | 2 ++ docker/tb-node/conf/logback.xml | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index fad92fe217..163028f009 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -51,8 +51,6 @@ import java.util.concurrent.atomic.AtomicInteger; @Service public class RemoteJsInvokeService extends AbstractJsInvokeService { - private static final int QUEUE_TRANSFER_DELAY = 2000; - @Value("${queue.js.max_eval_requests_timeout}") private long maxEvalRequestsTimeout; @@ -172,7 +170,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { .setScriptIdMSB(scriptId.getMostSignificantBits()) .setScriptIdLSB(scriptId.getLeastSignificantBits()) .setFunctionName(functionName) - .setTimeout((int) maxRequestsTimeout) + .setTimeout((int) (maxRequestsTimeout * 0.75)) // timeout on JS executor must be less than on Java .setScriptBody(scriptBody); for (Object arg : args) { @@ -188,7 +186,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { ListenableFuture> future = requestTemplate.send(new TbProtoJsQueueMsg<>(UUID.randomUUID(), jsRequestWrapper)); if (maxRequestsTimeout > 0) { - future = Futures.withTimeout(future, maxRequestsTimeout + QUEUE_TRANSFER_DELAY, TimeUnit.MILLISECONDS, timeoutExecutorService); + future = Futures.withTimeout(future, maxRequestsTimeout, TimeUnit.MILLISECONDS, timeoutExecutorService); } queuePushedMsgs.incrementAndGet(); Futures.addCallback(future, new FutureCallback>() { diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 9b458734f7..bccd35851e 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1044,7 +1044,7 @@ queue: # JS Eval max request timeout max_eval_requests_timeout: "${REMOTE_JS_MAX_EVAL_REQUEST_TIMEOUT:60000}" # JS max request timeout - max_requests_timeout: "${REMOTE_JS_MAX_REQUEST_TIMEOUT:10000}" + max_requests_timeout: "${REMOTE_JS_MAX_REQUEST_TIMEOUT:1500}" # JS response poll interval response_poll_interval: "${REMOTE_JS_RESPONSE_POLL_INTERVAL_MS:25}" rule-engine: diff --git a/docker/tb-node.env b/docker/tb-node.env index ba66757ecc..c6fb1348f4 100644 --- a/docker/tb-node.env +++ b/docker/tb-node.env @@ -5,6 +5,8 @@ ZOOKEEPER_URL=zookeeper:2181 JS_EVALUATOR=remote TRANSPORT_TYPE=remote +TB_JS_REMOTE_STATS_ENABLED=true + HTTP_LOG_CONTROLLER_ERROR_STACK_TRACE=false TB_QUEUE_PARTITIONS_VIRTUAL_NODES_SIZE=64 diff --git a/docker/tb-node/conf/logback.xml b/docker/tb-node/conf/logback.xml index bc694d704d..587be18d20 100644 --- a/docker/tb-node/conf/logback.xml +++ b/docker/tb-node/conf/logback.xml @@ -41,6 +41,7 @@ + From e32c42749f0691618dd1dc20932521867f02bf27 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 8 Jul 2022 12:03:05 +0300 Subject: [PATCH 08/10] Revert default logging --- docker/tb-node.env | 2 -- docker/tb-node/conf/logback.xml | 1 - msa/js-executor/docker/Dockerfile | 1 + 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docker/tb-node.env b/docker/tb-node.env index c6fb1348f4..ba66757ecc 100644 --- a/docker/tb-node.env +++ b/docker/tb-node.env @@ -5,8 +5,6 @@ ZOOKEEPER_URL=zookeeper:2181 JS_EVALUATOR=remote TRANSPORT_TYPE=remote -TB_JS_REMOTE_STATS_ENABLED=true - HTTP_LOG_CONTROLLER_ERROR_STACK_TRACE=false TB_QUEUE_PARTITIONS_VIRTUAL_NODES_SIZE=64 diff --git a/docker/tb-node/conf/logback.xml b/docker/tb-node/conf/logback.xml index 587be18d20..bc694d704d 100644 --- a/docker/tb-node/conf/logback.xml +++ b/docker/tb-node/conf/logback.xml @@ -41,7 +41,6 @@ - diff --git a/msa/js-executor/docker/Dockerfile b/msa/js-executor/docker/Dockerfile index 620d712ad1..d17138d923 100644 --- a/msa/js-executor/docker/Dockerfile +++ b/msa/js-executor/docker/Dockerfile @@ -29,6 +29,7 @@ COPY package/linux/conf ./conf COPY package/linux/conf ./config COPY src/api ./api COPY src/queue ./queue +COPY src/config ./config COPY src/server.js ./ RUN chmod a+x /tmp/*.sh \ From af52540cb21f3a95f139efacd350b4fc63e36559 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 8 Jul 2022 16:58:34 +0300 Subject: [PATCH 09/10] Added max execution requests timeout for remote JS executors --- .../server/service/script/RemoteJsInvokeService.java | 5 ++++- application/src/main/resources/thingsboard.yml | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index 163028f009..3715580286 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -57,6 +57,9 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { @Value("${queue.js.max_requests_timeout}") private long maxRequestsTimeout; + @Value("${queue.js.max_exec_requests_timeout}") + private long maxExecRequestsTimeout; + @Getter @Value("${js.remote.max_errors}") private int maxErrors; @@ -170,7 +173,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { .setScriptIdMSB(scriptId.getMostSignificantBits()) .setScriptIdLSB(scriptId.getLeastSignificantBits()) .setFunctionName(functionName) - .setTimeout((int) (maxRequestsTimeout * 0.75)) // timeout on JS executor must be less than on Java + .setTimeout((int) maxExecRequestsTimeout) .setScriptBody(scriptBody); for (Object arg : args) { diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index bccd35851e..cc009029cf 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1044,7 +1044,9 @@ queue: # JS Eval max request timeout max_eval_requests_timeout: "${REMOTE_JS_MAX_EVAL_REQUEST_TIMEOUT:60000}" # JS max request timeout - max_requests_timeout: "${REMOTE_JS_MAX_REQUEST_TIMEOUT:1500}" + max_requests_timeout: "${REMOTE_JS_MAX_REQUEST_TIMEOUT:10000}" + # JS execution max request timeout + max_exec_requests_timeout: "${REMOTE_JS_MAX_EXEC_REQUEST_TIMEOUT:2000}" # JS response poll interval response_poll_interval: "${REMOTE_JS_RESPONSE_POLL_INTERVAL_MS:25}" rule-engine: From bd7faa05b53185bea37c2c6ac71e104a4761ae03 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 8 Jul 2022 17:01:29 +0300 Subject: [PATCH 10/10] Added default value for remote max exec requests timeout --- .../server/service/script/RemoteJsInvokeService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index 3715580286..86b364afd4 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -57,7 +57,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { @Value("${queue.js.max_requests_timeout}") private long maxRequestsTimeout; - @Value("${queue.js.max_exec_requests_timeout}") + @Value("${queue.js.max_exec_requests_timeout:2000}") private long maxExecRequestsTimeout; @Getter