Commit 1dd3334825212603da640af693f1f95e274943c5

Authored by YevhenBondarenko
Committed by Andrew Shvayka
1 parent 7b3d4752

moved jsinvoke.proto to queue, fixed js-executor, added createRemoteJsRequestTem…

…plate to RuleEngine and Core factories
Showing 21 changed files with 353 additions and 76 deletions
... ... @@ -21,14 +21,15 @@ import com.google.common.util.concurrent.ListenableFuture;
21 21 import com.google.common.util.concurrent.MoreExecutors;
22 22 import lombok.Getter;
23 23 import lombok.extern.slf4j.Slf4j;
  24 +import org.springframework.beans.factory.annotation.Autowired;
24 25 import org.springframework.beans.factory.annotation.Value;
25   -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  26 +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
26 27 import org.springframework.scheduling.annotation.Scheduled;
27 28 import org.springframework.stereotype.Service;
28   -import org.thingsboard.server.queue.TbQueueProducer;
29   -import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
30   -import org.thingsboard.server.queue.common.TbProtoQueueMsg;
31 29 import org.thingsboard.server.gen.js.JsInvokeProtos;
  30 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  31 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
  32 +import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 33
33 34 import javax.annotation.Nullable;
34 35 import javax.annotation.PostConstruct;
... ... @@ -41,28 +42,13 @@ import java.util.concurrent.TimeoutException;
41 42 import java.util.concurrent.atomic.AtomicInteger;
42 43
43 44 @Slf4j
44   -@ConditionalOnProperty(prefix = "js", value = "evaluator", havingValue = "remote", matchIfMissing = true)
  45 +@ConditionalOnExpression("'${js.evaluator:null}'=='remote' && ('${service.type:null}'=='monolith' || '${service.type:null}'=='tb-core' || '${service.type:null}'=='tb-rule-engine')")
45 46 @Service
46 47 public class RemoteJsInvokeService extends AbstractJsInvokeService {
47 48
48   - @Value("${js.remote.request_topic}")
49   - private String requestTopic;
50   -
51   - @Value("${js.remote.response_topic_prefix}")
52   - private String responseTopicPrefix;
53   -
54   - @Value("${js.remote.max_pending_requests}")
55   - private long maxPendingRequests;
56   -
57 49 @Value("${js.remote.max_requests_timeout}")
58 50 private long maxRequestsTimeout;
59 51
60   - @Value("${js.remote.response_poll_interval}")
61   - private int responsePollDuration;
62   -
63   - @Value("${js.remote.response_auto_commit_interval}")
64   - private int autoCommitInterval;
65   -
66 52 @Getter
67 53 @Value("${js.remote.max_errors}")
68 54 private int maxErrors;
... ... @@ -94,43 +80,20 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
94 80 }
95 81 }
96 82
97   - private DefaultTbQueueRequestTemplate<TbProtoQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> defaultTemplate;
  83 + @Autowired
  84 + private TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> requestTemplate;
  85 +
98 86 private Map<UUID, String> scriptIdToBodysMap = new ConcurrentHashMap<>();
99 87
100 88 @PostConstruct
101 89 public void init() {
102   -// TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<TbProtoQueueMsg<JsInvokeProtos.RemoteJsRequest>> requestBuilder = TBKafkaProducerTemplate.builder();
103   -// requestBuilder.settings(kafkaSettings);
104   -// requestBuilder.clientId("producer-js-invoke-" + nodeIdProvider.getNodeId());
105   -// requestBuilder.defaultTopic(requestTopic);
106   -// requestBuilder.encoder(new RemoteJsRequestEncoder());
107   - TbQueueProducer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer;
108   -
109   -// TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<JsInvokeProtos.RemoteJsResponse> responseBuilder = TBKafkaConsumerTemplate.builder();
110   -// responseBuilder.settings(kafkaSettings);
111   -// responseBuilder.topic(responseTopicPrefix + "." + nodeIdProvider.getNodeId());
112   -// responseBuilder.clientId("js-" + nodeIdProvider.getNodeId());
113   -// responseBuilder.groupId("rule-engine-node-" + nodeIdProvider.getNodeId());
114   -// responseBuilder.autoCommit(true);
115   -// responseBuilder.autoCommitIntervalMs(autoCommitInterval);
116   -// responseBuilder.decoder(new RemoteJsResponseDecoder());
117   -// responseBuilder.requestIdExtractor((response) -> new UUID(response.getRequestIdMSB(), response.getRequestIdLSB()));
118   -//
119   -// TbKafkaRequestTemplate.TbKafkaRequestTemplateBuilder
120   -// <JsInvokeProtos.RemoteJsRequest, JsInvokeProtos.RemoteJsResponse> builder = TbKafkaRequestTemplate.builder();
121   -// builder.requestTemplate(requestBuilder.build());
122   -// builder.responseTemplate(responseBuilder.build());
123   -// builder.maxPendingRequests(maxPendingRequests);
124   -// builder.maxRequestTimeout(maxRequestsTimeout);
125   -// builder.pollInterval(responsePollDuration);
126   -// defaultTemplate = builder.build();
127   -// defaultTemplate.init();
  90 + requestTemplate.init();
128 91 }
129 92
130 93 @PreDestroy
131 94 public void destroy() {
132   - if (defaultTemplate != null) {
133   - defaultTemplate.stop();
  95 + if (requestTemplate != null) {
  96 + requestTemplate.stop();
134 97 }
135 98 }
136 99
... ... @@ -147,7 +110,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
147 110 .build();
148 111
149 112 log.trace("Post compile request for scriptId [{}]", scriptId);
150   - ListenableFuture<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> future = defaultTemplate.send(new TbProtoQueueMsg<>(UUID.randomUUID(), jsRequestWrapper));
  113 + ListenableFuture<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> future = requestTemplate.send(new TbProtoJsQueueMsg<>(UUID.randomUUID(), jsRequestWrapper));
151 114
152 115 kafkaPushedMsgs.incrementAndGet();
153 116 Futures.addCallback(future, new FutureCallback<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>>() {
... ... @@ -199,7 +162,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
199 162 .setInvokeRequest(jsRequestBuilder.build())
200 163 .build();
201 164
202   - ListenableFuture<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> future = defaultTemplate.send(new TbProtoQueueMsg<>(UUID.randomUUID(), jsRequestWrapper));
  165 + ListenableFuture<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> future = requestTemplate.send(new TbProtoJsQueueMsg<>(UUID.randomUUID(), jsRequestWrapper));
203 166 kafkaPushedMsgs.incrementAndGet();
204 167 Futures.addCallback(future, new FutureCallback<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>>() {
205 168 @Override
... ... @@ -239,7 +202,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
239 202 .setReleaseRequest(jsRequest)
240 203 .build();
241 204
242   - ListenableFuture<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> future = defaultTemplate.send(new TbProtoQueueMsg<>(UUID.randomUUID(), jsRequestWrapper));
  205 + ListenableFuture<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> future = requestTemplate.send(new TbProtoJsQueueMsg<>(UUID.randomUUID(), jsRequestWrapper));
243 206 JsInvokeProtos.RemoteJsResponse response = future.get().getValue();
244 207
245 208 JsInvokeProtos.JsReleaseResponse compilationResult = response.getReleaseResponse();
... ...
  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.queue.common;
  17 +
  18 +import com.google.protobuf.InvalidProtocolBufferException;
  19 +import com.google.protobuf.util.JsonFormat;
  20 +import org.thingsboard.server.queue.TbQueueMsgHeaders;
  21 +
  22 +import java.nio.charset.StandardCharsets;
  23 +import java.util.UUID;
  24 +
  25 +public class TbProtoJsQueueMsg<T extends com.google.protobuf.GeneratedMessageV3> extends TbProtoQueueMsg<T> {
  26 +
  27 + public TbProtoJsQueueMsg(UUID key, T value) {
  28 + super(key, value);
  29 + }
  30 +
  31 + public TbProtoJsQueueMsg(UUID key, T value, TbQueueMsgHeaders headers) {
  32 + super(key, value, headers);
  33 + }
  34 +
  35 + @Override
  36 + public byte[] getData() {
  37 + try {
  38 + return JsonFormat.printer().print(value).getBytes(StandardCharsets.UTF_8);
  39 + } catch (InvalidProtocolBufferException e) {
  40 + throw new RuntimeException(e);
  41 + }
  42 + }
  43 +}
... ...
... ... @@ -25,7 +25,7 @@ import java.util.UUID;
25 25 public class TbProtoQueueMsg<T extends com.google.protobuf.GeneratedMessageV3> implements TbQueueMsg {
26 26
27 27 private final UUID key;
28   - private final T value;
  28 + protected final T value;
29 29 private final TbQueueMsgHeaders headers;
30 30
31 31 public TbProtoQueueMsg(UUID key, T value) {
... ...
... ... @@ -18,10 +18,13 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 23 import org.thingsboard.server.queue.TbQueueAdmin;
23 24 import org.thingsboard.server.queue.TbQueueConsumer;
24 25 import org.thingsboard.server.queue.TbQueueProducer;
  26 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  27 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
25 28 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
26 29 import org.thingsboard.server.queue.discovery.PartitionService;
27 30 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
... ... @@ -125,4 +128,9 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng
125 128 public TbQueueProducer<TbProtoQueueMsg<TransportProtos.TransportApiResponseMsg>> createTransportApiResponseProducer() {
126 129 return new TbAwsSqsProducerTemplate<>(admin, sqsSettings, transportApiSettings.getResponsesTopic());
127 130 }
  131 +
  132 + @Override
  133 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  134 + return null;
  135 + }
128 136 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -28,6 +29,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
28 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 30 import org.thingsboard.server.queue.TbQueueConsumer;
30 31 import org.thingsboard.server.queue.TbQueueProducer;
  32 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  33 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
31 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 35 import org.thingsboard.server.queue.discovery.PartitionService;
33 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
... ... @@ -114,4 +117,9 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory {
114 117 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
115 118 return new TbAwsSqsProducerTemplate<>(admin, sqsSettings, coreSettings.getTopic());
116 119 }
  120 +
  121 + @Override
  122 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  123 + return null;
  124 + }
117 125 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -25,6 +26,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 26 import org.thingsboard.server.queue.TbQueueAdmin;
26 27 import org.thingsboard.server.queue.TbQueueConsumer;
27 28 import org.thingsboard.server.queue.TbQueueProducer;
  29 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  30 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
28 31 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
29 32 import org.thingsboard.server.queue.discovery.PartitionService;
30 33 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
... ... @@ -96,4 +99,9 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
96 99 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(),
97 100 msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders()));
98 101 }
  102 +
  103 + @Override
  104 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  105 + return null;
  106 + }
99 107 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
20 20 import org.springframework.stereotype.Component;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -27,6 +28,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 28 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 29 import org.thingsboard.server.queue.TbQueueConsumer;
29 30 import org.thingsboard.server.queue.TbQueueProducer;
  31 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  32 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
30 33 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
31 34 import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer;
32 35 import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer;
... ... @@ -110,4 +113,9 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE
110 113 public TbQueueConsumer<TbProtoQueueMsg<ToRuleEngineNotificationMsg>> createToRuleEngineNotificationsMsgConsumer() {
111 114 return new InMemoryTbQueueConsumer<>(ruleEngineSettings.getTopic() + ".notifications");
112 115 }
  116 +
  117 + @Override
  118 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  119 + return null;
  120 + }
113 121 }
... ...
... ... @@ -15,9 +15,12 @@
15 15 */
16 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import com.google.protobuf.util.JsonFormat;
18 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
  20 +import org.springframework.context.annotation.Bean;
19 21 import org.springframework.stereotype.Component;
20 22 import org.thingsboard.server.common.msg.queue.ServiceType;
  23 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 26 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -27,18 +30,25 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 30 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 31 import org.thingsboard.server.queue.TbQueueConsumer;
29 32 import org.thingsboard.server.queue.TbQueueProducer;
  33 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  34 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
  35 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
30 36 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
31 37 import org.thingsboard.server.queue.discovery.PartitionService;
32 38 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
  39 +import org.thingsboard.server.queue.kafka.TBKafkaAdmin;
33 40 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate;
34 41 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate;
35 42 import org.thingsboard.server.queue.kafka.TbKafkaSettings;
36 43 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  44 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
37 45 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
38 46 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
39 47 import org.thingsboard.server.queue.settings.TbQueueTransportNotificationSettings;
40 48 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
41 49
  50 +import java.nio.charset.StandardCharsets;
  51 +
42 52 @Component
43 53 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='monolith'")
44 54 public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory {
... ... @@ -50,13 +60,15 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
50 60 private final TbQueueRuleEngineSettings ruleEngineSettings;
51 61 private final TbQueueTransportApiSettings transportApiSettings;
52 62 private final TbQueueTransportNotificationSettings transportNotificationSettings;
  63 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
53 64
54 65 public KafkaMonolithQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings,
55 66 TbServiceInfoProvider serviceInfoProvider,
56 67 TbQueueCoreSettings coreSettings,
57 68 TbQueueRuleEngineSettings ruleEngineSettings,
58 69 TbQueueTransportApiSettings transportApiSettings,
59   - TbQueueTransportNotificationSettings transportNotificationSettings) {
  70 + TbQueueTransportNotificationSettings transportNotificationSettings,
  71 + TbQueueRemoteJsInvokeSettings jsInvokeSettings) {
60 72 this.partitionService = partitionService;
61 73 this.kafkaSettings = kafkaSettings;
62 74 this.serviceInfoProvider = serviceInfoProvider;
... ... @@ -64,6 +76,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
64 76 this.ruleEngineSettings = ruleEngineSettings;
65 77 this.transportApiSettings = transportApiSettings;
66 78 this.transportNotificationSettings = transportNotificationSettings;
  79 + this.jsInvokeSettings = jsInvokeSettings;
67 80 }
68 81
69 82 @Override
... ... @@ -175,4 +188,37 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
175 188 requestBuilder.defaultTopic(transportApiSettings.getResponsesTopic());
176 189 return requestBuilder.build();
177 190 }
  191 +
  192 + @Override
  193 + @Bean
  194 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  195 + TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> requestBuilder = TBKafkaProducerTemplate.builder();
  196 + requestBuilder.settings(kafkaSettings);
  197 + requestBuilder.clientId("producer-js-invoke-" + serviceInfoProvider.getServiceId());
  198 + requestBuilder.defaultTopic(jsInvokeSettings.getRequestTopic());
  199 +
  200 + TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> responseBuilder = TBKafkaConsumerTemplate.builder();
  201 + responseBuilder.settings(kafkaSettings);
  202 + responseBuilder.topic(jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId());
  203 + responseBuilder.clientId("js-" + serviceInfoProvider.getServiceId());
  204 + responseBuilder.groupId("rule-engine-node-" + serviceInfoProvider.getServiceId());
  205 +// responseBuilder.autoCommit(true);
  206 +// responseBuilder.autoCommitIntervalMs(autoCommitInterval);
  207 + responseBuilder.decoder(msg -> {
  208 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  209 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  210 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  211 + }
  212 + );
  213 +
  214 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  215 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  216 + builder.queueAdmin(new TBKafkaAdmin(kafkaSettings));
  217 + builder.requestTemplate(requestBuilder.build());
  218 + builder.responseTemplate(responseBuilder.build());
  219 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  220 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  221 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  222 + return builder.build();
  223 + }
178 224 }
... ...
... ... @@ -15,9 +15,12 @@
15 15 */
16 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import com.google.protobuf.util.JsonFormat;
18 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
  20 +import org.springframework.context.annotation.Bean;
19 21 import org.springframework.stereotype.Component;
20 22 import org.thingsboard.server.common.msg.queue.ServiceType;
  23 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 26 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -27,16 +30,23 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 30 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 31 import org.thingsboard.server.queue.TbQueueConsumer;
29 32 import org.thingsboard.server.queue.TbQueueProducer;
  33 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  34 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
  35 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
30 36 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
31 37 import org.thingsboard.server.queue.discovery.PartitionService;
32 38 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
  39 +import org.thingsboard.server.queue.kafka.TBKafkaAdmin;
33 40 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate;
34 41 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate;
35 42 import org.thingsboard.server.queue.kafka.TbKafkaSettings;
36 43 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  44 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
37 45 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
38 46 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
39 47
  48 +import java.nio.charset.StandardCharsets;
  49 +
40 50 @Component
41 51 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-core'")
42 52 public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
... ... @@ -47,18 +57,21 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
47 57 private final TbQueueCoreSettings coreSettings;
48 58 private final TbQueueRuleEngineSettings ruleEngineSettings;
49 59 private final TbQueueTransportApiSettings transportApiSettings;
  60 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
50 61
51 62 public KafkaTbCoreQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings,
52 63 TbServiceInfoProvider serviceInfoProvider,
53 64 TbQueueCoreSettings coreSettings,
54 65 TbQueueRuleEngineSettings ruleEngineSettings,
55   - TbQueueTransportApiSettings transportApiSettings) {
  66 + TbQueueTransportApiSettings transportApiSettings,
  67 + TbQueueRemoteJsInvokeSettings jsInvokeSettings) {
56 68 this.partitionService = partitionService;
57 69 this.kafkaSettings = kafkaSettings;
58 70 this.serviceInfoProvider = serviceInfoProvider;
59 71 this.coreSettings = coreSettings;
60 72 this.ruleEngineSettings = ruleEngineSettings;
61 73 this.transportApiSettings = transportApiSettings;
  74 + this.jsInvokeSettings = jsInvokeSettings;
62 75 }
63 76
64 77 @Override
... ... @@ -148,4 +161,37 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
148 161 return requestBuilder.build();
149 162 }
150 163
  164 + @Override
  165 + @Bean
  166 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  167 + TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> requestBuilder = TBKafkaProducerTemplate.builder();
  168 + requestBuilder.settings(kafkaSettings);
  169 + requestBuilder.clientId("producer-js-invoke-" + serviceInfoProvider.getServiceId());
  170 + requestBuilder.defaultTopic(jsInvokeSettings.getRequestTopic());
  171 +
  172 + TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> responseBuilder = TBKafkaConsumerTemplate.builder();
  173 + responseBuilder.settings(kafkaSettings);
  174 + responseBuilder.topic(jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId());
  175 + responseBuilder.clientId("js-" + serviceInfoProvider.getServiceId());
  176 + responseBuilder.groupId("rule-engine-node-" + serviceInfoProvider.getServiceId());
  177 +// responseBuilder.autoCommit(true);
  178 +// responseBuilder.autoCommitIntervalMs(autoCommitInterval);
  179 + responseBuilder.decoder(msg -> {
  180 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  181 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  182 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  183 + }
  184 + );
  185 +
  186 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  187 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  188 + builder.queueAdmin(new TBKafkaAdmin(kafkaSettings));
  189 + builder.requestTemplate(requestBuilder.build());
  190 + builder.responseTemplate(responseBuilder.build());
  191 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  192 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  193 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  194 + return builder.build();
  195 + }
  196 +
151 197 }
... ...
... ... @@ -15,9 +15,12 @@
15 15 */
16 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import com.google.protobuf.util.JsonFormat;
18 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
  20 +import org.springframework.context.annotation.Bean;
19 21 import org.springframework.stereotype.Component;
20 22 import org.thingsboard.server.common.msg.queue.ServiceType;
  23 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 26 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -25,16 +28,23 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotifica
25 28 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
26 29 import org.thingsboard.server.queue.TbQueueConsumer;
27 30 import org.thingsboard.server.queue.TbQueueProducer;
  31 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  32 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
  33 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
28 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
29 35 import org.thingsboard.server.queue.discovery.PartitionService;
30 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
  37 +import org.thingsboard.server.queue.kafka.TBKafkaAdmin;
31 38 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate;
32 39 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate;
33 40 import org.thingsboard.server.queue.kafka.TbKafkaSettings;
34 41 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  42 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
35 43 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
36 44 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
37 45
  46 +import java.nio.charset.StandardCharsets;
  47 +
38 48 @Component
39 49 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-rule-engine'")
40 50 public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
... ... @@ -44,16 +54,19 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
44 54 private final TbServiceInfoProvider serviceInfoProvider;
45 55 private final TbQueueCoreSettings coreSettings;
46 56 private final TbQueueRuleEngineSettings ruleEngineSettings;
  57 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
47 58
48 59 public KafkaTbRuleEngineQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings,
49 60 TbServiceInfoProvider serviceInfoProvider,
50 61 TbQueueCoreSettings coreSettings,
51   - TbQueueRuleEngineSettings ruleEngineSettings) {
  62 + TbQueueRuleEngineSettings ruleEngineSettings,
  63 + TbQueueRemoteJsInvokeSettings jsInvokeSettings) {
52 64 this.partitionService = partitionService;
53 65 this.kafkaSettings = kafkaSettings;
54 66 this.serviceInfoProvider = serviceInfoProvider;
55 67 this.coreSettings = coreSettings;
56 68 this.ruleEngineSettings = ruleEngineSettings;
  69 + this.jsInvokeSettings = jsInvokeSettings;
57 70 }
58 71
59 72 @Override
... ... @@ -124,4 +137,37 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
124 137 consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders()));
125 138 return consumerBuilder.build();
126 139 }
  140 +
  141 + @Override
  142 + @Bean
  143 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  144 + TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> requestBuilder = TBKafkaProducerTemplate.builder();
  145 + requestBuilder.settings(kafkaSettings);
  146 + requestBuilder.clientId("producer-js-invoke-" + serviceInfoProvider.getServiceId());
  147 + requestBuilder.defaultTopic(jsInvokeSettings.getRequestTopic());
  148 +
  149 + TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> responseBuilder = TBKafkaConsumerTemplate.builder();
  150 + responseBuilder.settings(kafkaSettings);
  151 + responseBuilder.topic(jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId());
  152 + responseBuilder.clientId("js-" + serviceInfoProvider.getServiceId());
  153 + responseBuilder.groupId("rule-engine-node-" + serviceInfoProvider.getServiceId());
  154 +// responseBuilder.autoCommit(true);
  155 +// responseBuilder.autoCommitIntervalMs(autoCommitInterval);
  156 + responseBuilder.decoder(msg -> {
  157 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  158 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  159 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  160 + }
  161 + );
  162 +
  163 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  164 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  165 + builder.queueAdmin(new TBKafkaAdmin(kafkaSettings));
  166 + builder.requestTemplate(requestBuilder.build());
  167 + builder.responseTemplate(responseBuilder.build());
  168 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  169 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  170 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  171 + return builder.build();
  172 + }
127 173 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -28,6 +29,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
28 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 30 import org.thingsboard.server.queue.TbQueueConsumer;
30 31 import org.thingsboard.server.queue.TbQueueProducer;
  32 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  33 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
31 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 35 import org.thingsboard.server.queue.discovery.PartitionService;
33 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
... ... @@ -133,4 +136,9 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng
133 136 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
134 137 return new TbPubSubProducerTemplate<>(admin, pubSubSettings, transportApiSettings.getResponsesTopic());
135 138 }
  139 +
  140 + @Override
  141 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  142 + return null;
  143 + }
136 144 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -27,6 +28,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 28 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 30 import org.thingsboard.server.queue.TbQueueConsumer;
  31 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  32 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
30 33 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
31 34 import org.thingsboard.server.queue.TbQueueProducer;
32 35 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
... ... @@ -110,4 +113,9 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory {
110 113 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
111 114 return new TbPubSubProducerTemplate<>(admin, pubSubSettings, coreSettings.getTopic());
112 115 }
  116 +
  117 + @Override
  118 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  119 + return null;
  120 + }
113 121 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -25,15 +26,17 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotifica
25 26 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
26 27 import org.thingsboard.server.queue.TbQueueAdmin;
27 28 import org.thingsboard.server.queue.TbQueueConsumer;
28   -import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
29 29 import org.thingsboard.server.queue.TbQueueProducer;
30   -import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
  30 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  31 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
31 32 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 33 import org.thingsboard.server.queue.discovery.PartitionService;
33 34 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
34 35 import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate;
35 36 import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate;
36 37 import org.thingsboard.server.queue.pubsub.TbPubSubSettings;
  38 +import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  39 +import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
37 40 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
38 41
39 42 @Component
... ... @@ -99,4 +102,9 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
99 102 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(),
100 103 msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders()));
101 104 }
  105 +
  106 + @Override
  107 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  108 + return null;
  109 + }
102 110 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -28,9 +29,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
28 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 30 import org.thingsboard.server.queue.TbQueueConsumer;
30 31 import org.thingsboard.server.queue.TbQueueProducer;
  32 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
31 33 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate;
32 34 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate;
33 35 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings;
  36 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
34 37 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
35 38 import org.thingsboard.server.queue.discovery.PartitionService;
36 39 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
... ... @@ -131,4 +134,9 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul
131 134 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
132 135 return new TbServiceBusProducerTemplate<>(admin, serviceBusSettings, transportApiSettings.getResponsesTopic());
133 136 }
  137 +
  138 + @Override
  139 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  140 + return null;
  141 + }
134 142 }
... ...
common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java renamed from common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueProvider.java
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -27,9 +28,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
27 28 import org.thingsboard.server.queue.TbQueueAdmin;
28 29 import org.thingsboard.server.queue.TbQueueConsumer;
29 30 import org.thingsboard.server.queue.TbQueueProducer;
  31 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
30 32 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate;
31 33 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate;
32 34 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings;
  35 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
33 36 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
34 37 import org.thingsboard.server.queue.discovery.PartitionService;
35 38 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
... ... @@ -39,7 +42,7 @@ import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
39 42
40 43 @Component
41 44 @ConditionalOnExpression("'${queue.type:null}'=='service-bus' && '${service.type:null}'=='tb-core'")
42   -public class ServiceBusTbCoreQueueProvider implements TbCoreQueueFactory {
  45 +public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory {
43 46
44 47 private final TbServiceBusSettings serviceBusSettings;
45 48 private final TbQueueRuleEngineSettings ruleEngineSettings;
... ... @@ -49,13 +52,13 @@ public class ServiceBusTbCoreQueueProvider implements TbCoreQueueFactory {
49 52 private final TbServiceInfoProvider serviceInfoProvider;
50 53 private final TbQueueAdmin admin;
51 54
52   - public ServiceBusTbCoreQueueProvider(TbServiceBusSettings serviceBusSettings,
53   - TbQueueCoreSettings coreSettings,
54   - TbQueueTransportApiSettings transportApiSettings,
55   - TbQueueRuleEngineSettings ruleEngineSettings,
56   - PartitionService partitionService,
57   - TbServiceInfoProvider serviceInfoProvider,
58   - TbQueueAdmin admin) {
  55 + public ServiceBusTbCoreQueueFactory(TbServiceBusSettings serviceBusSettings,
  56 + TbQueueCoreSettings coreSettings,
  57 + TbQueueTransportApiSettings transportApiSettings,
  58 + TbQueueRuleEngineSettings ruleEngineSettings,
  59 + PartitionService partitionService,
  60 + TbServiceInfoProvider serviceInfoProvider,
  61 + TbQueueAdmin admin) {
59 62 this.serviceBusSettings = serviceBusSettings;
60 63 this.coreSettings = coreSettings;
61 64 this.transportApiSettings = transportApiSettings;
... ... @@ -113,4 +116,9 @@ public class ServiceBusTbCoreQueueProvider implements TbCoreQueueFactory {
113 116 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
114 117 return new TbServiceBusProducerTemplate<>(admin, serviceBusSettings, coreSettings.getTopic());
115 118 }
  119 +
  120 + @Override
  121 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  122 + return null;
  123 + }
116 124 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 19 import org.springframework.stereotype.Component;
20 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -25,9 +26,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 26 import org.thingsboard.server.queue.TbQueueAdmin;
26 27 import org.thingsboard.server.queue.TbQueueConsumer;
27 28 import org.thingsboard.server.queue.TbQueueProducer;
  29 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
28 30 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate;
29 31 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate;
30 32 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings;
  33 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
31 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 35 import org.thingsboard.server.queue.discovery.PartitionService;
33 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
... ... @@ -96,4 +99,9 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact
96 99 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(),
97 100 msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders()));
98 101 }
  102 +
  103 + @Override
  104 + public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
  105 + return null;
  106 + }
99 107 }
... ...
... ... @@ -15,15 +15,19 @@
15 15 */
16 16 package org.thingsboard.server.queue.provider;
17 17
18   -import org.thingsboard.server.gen.transport.TransportProtos.*;
19   -import org.thingsboard.server.queue.TbQueueConsumer;
20   -import org.thingsboard.server.queue.TbQueueProducer;
21   -import org.thingsboard.server.queue.common.TbProtoQueueMsg;
  18 +import org.thingsboard.server.gen.js.JsInvokeProtos;
22 19 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
  20 +import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 21 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
  22 +import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
24 23 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 24 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg;
26 25 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
  26 +import org.thingsboard.server.queue.TbQueueConsumer;
  27 +import org.thingsboard.server.queue.TbQueueProducer;
  28 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  29 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
  30 +import org.thingsboard.server.queue.common.TbProtoQueueMsg;
27 31
28 32 /**
29 33 * Responsible for initialization of various Producers and Consumers used by TB Core Node.
... ... @@ -94,5 +98,5 @@ public interface TbCoreQueueFactory {
94 98 */
95 99 TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer();
96 100
97   -
  101 + TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate();
98 102 }
... ...
... ... @@ -15,14 +15,17 @@
15 15 */
16 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import org.thingsboard.server.gen.js.JsInvokeProtos;
18 19 import org.thingsboard.server.gen.transport.TransportProtos;
19   -import org.thingsboard.server.queue.TbQueueConsumer;
20   -import org.thingsboard.server.queue.TbQueueProducer;
21   -import org.thingsboard.server.queue.common.TbProtoQueueMsg;
22 20 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 21 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
24   -import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 22 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
  23 +import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
  24 +import org.thingsboard.server.queue.TbQueueConsumer;
  25 +import org.thingsboard.server.queue.TbQueueProducer;
  26 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  27 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
  28 +import org.thingsboard.server.queue.common.TbProtoQueueMsg;
26 29 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
27 30
28 31 /**
... ... @@ -82,4 +85,5 @@ public interface TbRuleEngineQueueFactory {
82 85 */
83 86 TbQueueConsumer<TbProtoQueueMsg<ToRuleEngineNotificationMsg>> createToRuleEngineNotificationsMsgConsumer();
84 87
  88 + TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate();
85 89 }
... ...
  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.queue.settings;
  17 +
  18 +import lombok.Data;
  19 +import org.springframework.beans.factory.annotation.Value;
  20 +import org.springframework.stereotype.Component;
  21 +
  22 +@Data
  23 +@Component
  24 +public class TbQueueRemoteJsInvokeSettings {
  25 + @Value("${js.remote.request_topic}")
  26 + private String requestTopic;
  27 +
  28 + @Value("${js.remote.response_topic_prefix}")
  29 + private String responseTopic;
  30 +
  31 + @Value("${js.remote.max_pending_requests}")
  32 + private long maxPendingRequests;
  33 +
  34 + @Value("${js.remote.response_poll_interval}")
  35 + private int responsePollInterval;
  36 +
  37 + @Value("${js.remote.response_auto_commit_interval}")
  38 + private int autoCommitInterval;
  39 +
  40 + @Value("${js.remote.max_requests_timeout}")
  41 + private long maxRequestsTimeout;
  42 +}
... ...
common/queue/src/main/proto/jsinvoke.proto renamed from application/src/main/proto/jsinvoke.proto
... ... @@ -19,6 +19,7 @@ const COMPILATION_ERROR = 0;
19 19 const RUNTIME_ERROR = 1;
20 20 const TIMEOUT_ERROR = 2;
21 21 const UNRECOGNIZED = -1;
  22 +let headers;
22 23
23 24 const config = require('config'),
24 25 logger = require('../config/logger')._logger('JsInvokeMessageProcessor'),
... ... @@ -43,6 +44,7 @@ JsInvokeMessageProcessor.prototype.onJsInvokeMessage = function(message) {
43 44 var responseTopic;
44 45 try {
45 46 var request = JSON.parse(message.value.toString('utf8'));
  47 + headers = message.headers;
46 48 var buf = message.headers['requestId'];
47 49 requestId = Utils.UUIDFromBuffer(buf);
48 50 buf = message.headers['responseTopic'];
... ... @@ -148,7 +150,8 @@ JsInvokeMessageProcessor.prototype.sendResponse = function (requestId, responseT
148 150 messages: [
149 151 {
150 152 key: scriptId,
151   - value: rawResponse
  153 + value: rawResponse,
  154 + headers: headers
152 155 }
153 156 ]
154 157 }
... ...