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,14 +21,15 @@ import com.google.common.util.concurrent.ListenableFuture;
21 import com.google.common.util.concurrent.MoreExecutors; 21 import com.google.common.util.concurrent.MoreExecutors;
22 import lombok.Getter; 22 import lombok.Getter;
23 import lombok.extern.slf4j.Slf4j; 23 import lombok.extern.slf4j.Slf4j;
  24 +import org.springframework.beans.factory.annotation.Autowired;
24 import org.springframework.beans.factory.annotation.Value; 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 import org.springframework.scheduling.annotation.Scheduled; 27 import org.springframework.scheduling.annotation.Scheduled;
27 import org.springframework.stereotype.Service; 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 import org.thingsboard.server.gen.js.JsInvokeProtos; 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 import javax.annotation.Nullable; 34 import javax.annotation.Nullable;
34 import javax.annotation.PostConstruct; 35 import javax.annotation.PostConstruct;
@@ -41,28 +42,13 @@ import java.util.concurrent.TimeoutException; @@ -41,28 +42,13 @@ import java.util.concurrent.TimeoutException;
41 import java.util.concurrent.atomic.AtomicInteger; 42 import java.util.concurrent.atomic.AtomicInteger;
42 43
43 @Slf4j 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 @Service 46 @Service
46 public class RemoteJsInvokeService extends AbstractJsInvokeService { 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 @Value("${js.remote.max_requests_timeout}") 49 @Value("${js.remote.max_requests_timeout}")
58 private long maxRequestsTimeout; 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 @Getter 52 @Getter
67 @Value("${js.remote.max_errors}") 53 @Value("${js.remote.max_errors}")
68 private int maxErrors; 54 private int maxErrors;
@@ -94,43 +80,20 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { @@ -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 private Map<UUID, String> scriptIdToBodysMap = new ConcurrentHashMap<>(); 86 private Map<UUID, String> scriptIdToBodysMap = new ConcurrentHashMap<>();
99 87
100 @PostConstruct 88 @PostConstruct
101 public void init() { 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 @PreDestroy 93 @PreDestroy
131 public void destroy() { 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,7 +110,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
147 .build(); 110 .build();
148 111
149 log.trace("Post compile request for scriptId [{}]", scriptId); 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 kafkaPushedMsgs.incrementAndGet(); 115 kafkaPushedMsgs.incrementAndGet();
153 Futures.addCallback(future, new FutureCallback<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>>() { 116 Futures.addCallback(future, new FutureCallback<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>>() {
@@ -199,7 +162,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { @@ -199,7 +162,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
199 .setInvokeRequest(jsRequestBuilder.build()) 162 .setInvokeRequest(jsRequestBuilder.build())
200 .build(); 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 kafkaPushedMsgs.incrementAndGet(); 166 kafkaPushedMsgs.incrementAndGet();
204 Futures.addCallback(future, new FutureCallback<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>>() { 167 Futures.addCallback(future, new FutureCallback<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>>() {
205 @Override 168 @Override
@@ -239,7 +202,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { @@ -239,7 +202,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
239 .setReleaseRequest(jsRequest) 202 .setReleaseRequest(jsRequest)
240 .build(); 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 JsInvokeProtos.RemoteJsResponse response = future.get().getValue(); 206 JsInvokeProtos.RemoteJsResponse response = future.get().getValue();
244 207
245 JsInvokeProtos.JsReleaseResponse compilationResult = response.getReleaseResponse(); 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,7 +25,7 @@ import java.util.UUID;
25 public class TbProtoQueueMsg<T extends com.google.protobuf.GeneratedMessageV3> implements TbQueueMsg { 25 public class TbProtoQueueMsg<T extends com.google.protobuf.GeneratedMessageV3> implements TbQueueMsg {
26 26
27 private final UUID key; 27 private final UUID key;
28 - private final T value; 28 + protected final T value;
29 private final TbQueueMsgHeaders headers; 29 private final TbQueueMsgHeaders headers;
30 30
31 public TbProtoQueueMsg(UUID key, T value) { 31 public TbProtoQueueMsg(UUID key, T value) {
@@ -18,10 +18,13 @@ package org.thingsboard.server.queue.provider; @@ -18,10 +18,13 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos; 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 import org.thingsboard.server.queue.TbQueueAdmin; 23 import org.thingsboard.server.queue.TbQueueAdmin;
23 import org.thingsboard.server.queue.TbQueueConsumer; 24 import org.thingsboard.server.queue.TbQueueConsumer;
24 import org.thingsboard.server.queue.TbQueueProducer; 25 import org.thingsboard.server.queue.TbQueueProducer;
  26 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  27 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
25 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 28 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
26 import org.thingsboard.server.queue.discovery.PartitionService; 29 import org.thingsboard.server.queue.discovery.PartitionService;
27 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 30 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
@@ -125,4 +128,9 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @@ -125,4 +128,9 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng
125 public TbQueueProducer<TbProtoQueueMsg<TransportProtos.TransportApiResponseMsg>> createTransportApiResponseProducer() { 128 public TbQueueProducer<TbProtoQueueMsg<TransportProtos.TransportApiResponseMsg>> createTransportApiResponseProducer() {
126 return new TbAwsSqsProducerTemplate<>(admin, sqsSettings, transportApiSettings.getResponsesTopic()); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -28,6 +29,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse @@ -28,6 +29,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
28 import org.thingsboard.server.queue.TbQueueAdmin; 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 import org.thingsboard.server.queue.TbQueueConsumer; 30 import org.thingsboard.server.queue.TbQueueConsumer;
30 import org.thingsboard.server.queue.TbQueueProducer; 31 import org.thingsboard.server.queue.TbQueueProducer;
  32 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  33 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
31 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 import org.thingsboard.server.queue.discovery.PartitionService; 35 import org.thingsboard.server.queue.discovery.PartitionService;
33 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
@@ -114,4 +117,9 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { @@ -114,4 +117,9 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory {
114 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() { 117 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
115 return new TbAwsSqsProducerTemplate<>(admin, sqsSettings, coreSettings.getTopic()); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos; 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -25,6 +26,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; @@ -25,6 +26,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 import org.thingsboard.server.queue.TbQueueAdmin; 26 import org.thingsboard.server.queue.TbQueueAdmin;
26 import org.thingsboard.server.queue.TbQueueConsumer; 27 import org.thingsboard.server.queue.TbQueueConsumer;
27 import org.thingsboard.server.queue.TbQueueProducer; 28 import org.thingsboard.server.queue.TbQueueProducer;
  29 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  30 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
28 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 31 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
29 import org.thingsboard.server.queue.discovery.PartitionService; 32 import org.thingsboard.server.queue.discovery.PartitionService;
30 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 33 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
@@ -96,4 +99,9 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @@ -96,4 +99,9 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
96 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), 99 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(),
97 msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import lombok.extern.slf4j.Slf4j; 18 import lombok.extern.slf4j.Slf4j;
19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
20 import org.springframework.stereotype.Component; 20 import org.springframework.stereotype.Component;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -27,6 +28,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM @@ -27,6 +28,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg; 28 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 import org.thingsboard.server.queue.TbQueueConsumer; 29 import org.thingsboard.server.queue.TbQueueConsumer;
29 import org.thingsboard.server.queue.TbQueueProducer; 30 import org.thingsboard.server.queue.TbQueueProducer;
  31 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  32 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
30 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 33 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
31 import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; 34 import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer;
32 import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer; 35 import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer;
@@ -110,4 +113,9 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @@ -110,4 +113,9 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE
110 public TbQueueConsumer<TbProtoQueueMsg<ToRuleEngineNotificationMsg>> createToRuleEngineNotificationsMsgConsumer() { 113 public TbQueueConsumer<TbProtoQueueMsg<ToRuleEngineNotificationMsg>> createToRuleEngineNotificationsMsgConsumer() {
111 return new InMemoryTbQueueConsumer<>(ruleEngineSettings.getTopic() + ".notifications"); 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,9 +15,12 @@
15 */ 15 */
16 package org.thingsboard.server.queue.provider; 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import com.google.protobuf.util.JsonFormat;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
  20 +import org.springframework.context.annotation.Bean;
19 import org.springframework.stereotype.Component; 21 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 22 import org.thingsboard.server.common.msg.queue.ServiceType;
  23 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 26 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -27,18 +30,25 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM @@ -27,18 +30,25 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg; 30 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 import org.thingsboard.server.queue.TbQueueConsumer; 31 import org.thingsboard.server.queue.TbQueueConsumer;
29 import org.thingsboard.server.queue.TbQueueProducer; 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 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 36 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
31 import org.thingsboard.server.queue.discovery.PartitionService; 37 import org.thingsboard.server.queue.discovery.PartitionService;
32 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 38 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
  39 +import org.thingsboard.server.queue.kafka.TBKafkaAdmin;
33 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate; 40 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate;
34 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate; 41 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate;
35 import org.thingsboard.server.queue.kafka.TbKafkaSettings; 42 import org.thingsboard.server.queue.kafka.TbKafkaSettings;
36 import org.thingsboard.server.queue.settings.TbQueueCoreSettings; 43 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  44 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
37 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings; 45 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
38 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; 46 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
39 import org.thingsboard.server.queue.settings.TbQueueTransportNotificationSettings; 47 import org.thingsboard.server.queue.settings.TbQueueTransportNotificationSettings;
40 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration; 48 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
41 49
  50 +import java.nio.charset.StandardCharsets;
  51 +
42 @Component 52 @Component
43 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='monolith'") 53 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='monolith'")
44 public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory { 54 public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory {
@@ -50,13 +60,15 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi @@ -50,13 +60,15 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
50 private final TbQueueRuleEngineSettings ruleEngineSettings; 60 private final TbQueueRuleEngineSettings ruleEngineSettings;
51 private final TbQueueTransportApiSettings transportApiSettings; 61 private final TbQueueTransportApiSettings transportApiSettings;
52 private final TbQueueTransportNotificationSettings transportNotificationSettings; 62 private final TbQueueTransportNotificationSettings transportNotificationSettings;
  63 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
53 64
54 public KafkaMonolithQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings, 65 public KafkaMonolithQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings,
55 TbServiceInfoProvider serviceInfoProvider, 66 TbServiceInfoProvider serviceInfoProvider,
56 TbQueueCoreSettings coreSettings, 67 TbQueueCoreSettings coreSettings,
57 TbQueueRuleEngineSettings ruleEngineSettings, 68 TbQueueRuleEngineSettings ruleEngineSettings,
58 TbQueueTransportApiSettings transportApiSettings, 69 TbQueueTransportApiSettings transportApiSettings,
59 - TbQueueTransportNotificationSettings transportNotificationSettings) { 70 + TbQueueTransportNotificationSettings transportNotificationSettings,
  71 + TbQueueRemoteJsInvokeSettings jsInvokeSettings) {
60 this.partitionService = partitionService; 72 this.partitionService = partitionService;
61 this.kafkaSettings = kafkaSettings; 73 this.kafkaSettings = kafkaSettings;
62 this.serviceInfoProvider = serviceInfoProvider; 74 this.serviceInfoProvider = serviceInfoProvider;
@@ -64,6 +76,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi @@ -64,6 +76,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
64 this.ruleEngineSettings = ruleEngineSettings; 76 this.ruleEngineSettings = ruleEngineSettings;
65 this.transportApiSettings = transportApiSettings; 77 this.transportApiSettings = transportApiSettings;
66 this.transportNotificationSettings = transportNotificationSettings; 78 this.transportNotificationSettings = transportNotificationSettings;
  79 + this.jsInvokeSettings = jsInvokeSettings;
67 } 80 }
68 81
69 @Override 82 @Override
@@ -175,4 +188,37 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi @@ -175,4 +188,37 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
175 requestBuilder.defaultTopic(transportApiSettings.getResponsesTopic()); 188 requestBuilder.defaultTopic(transportApiSettings.getResponsesTopic());
176 return requestBuilder.build(); 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,9 +15,12 @@
15 */ 15 */
16 package org.thingsboard.server.queue.provider; 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import com.google.protobuf.util.JsonFormat;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
  20 +import org.springframework.context.annotation.Bean;
19 import org.springframework.stereotype.Component; 21 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 22 import org.thingsboard.server.common.msg.queue.ServiceType;
  23 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 26 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -27,16 +30,23 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM @@ -27,16 +30,23 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg; 30 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 import org.thingsboard.server.queue.TbQueueConsumer; 31 import org.thingsboard.server.queue.TbQueueConsumer;
29 import org.thingsboard.server.queue.TbQueueProducer; 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 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 36 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
31 import org.thingsboard.server.queue.discovery.PartitionService; 37 import org.thingsboard.server.queue.discovery.PartitionService;
32 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 38 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
  39 +import org.thingsboard.server.queue.kafka.TBKafkaAdmin;
33 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate; 40 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate;
34 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate; 41 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate;
35 import org.thingsboard.server.queue.kafka.TbKafkaSettings; 42 import org.thingsboard.server.queue.kafka.TbKafkaSettings;
36 import org.thingsboard.server.queue.settings.TbQueueCoreSettings; 43 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  44 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
37 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings; 45 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
38 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; 46 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
39 47
  48 +import java.nio.charset.StandardCharsets;
  49 +
40 @Component 50 @Component
41 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-core'") 51 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-core'")
42 public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { 52 public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
@@ -47,18 +57,21 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { @@ -47,18 +57,21 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
47 private final TbQueueCoreSettings coreSettings; 57 private final TbQueueCoreSettings coreSettings;
48 private final TbQueueRuleEngineSettings ruleEngineSettings; 58 private final TbQueueRuleEngineSettings ruleEngineSettings;
49 private final TbQueueTransportApiSettings transportApiSettings; 59 private final TbQueueTransportApiSettings transportApiSettings;
  60 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
50 61
51 public KafkaTbCoreQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings, 62 public KafkaTbCoreQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings,
52 TbServiceInfoProvider serviceInfoProvider, 63 TbServiceInfoProvider serviceInfoProvider,
53 TbQueueCoreSettings coreSettings, 64 TbQueueCoreSettings coreSettings,
54 TbQueueRuleEngineSettings ruleEngineSettings, 65 TbQueueRuleEngineSettings ruleEngineSettings,
55 - TbQueueTransportApiSettings transportApiSettings) { 66 + TbQueueTransportApiSettings transportApiSettings,
  67 + TbQueueRemoteJsInvokeSettings jsInvokeSettings) {
56 this.partitionService = partitionService; 68 this.partitionService = partitionService;
57 this.kafkaSettings = kafkaSettings; 69 this.kafkaSettings = kafkaSettings;
58 this.serviceInfoProvider = serviceInfoProvider; 70 this.serviceInfoProvider = serviceInfoProvider;
59 this.coreSettings = coreSettings; 71 this.coreSettings = coreSettings;
60 this.ruleEngineSettings = ruleEngineSettings; 72 this.ruleEngineSettings = ruleEngineSettings;
61 this.transportApiSettings = transportApiSettings; 73 this.transportApiSettings = transportApiSettings;
  74 + this.jsInvokeSettings = jsInvokeSettings;
62 } 75 }
63 76
64 @Override 77 @Override
@@ -148,4 +161,37 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { @@ -148,4 +161,37 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
148 return requestBuilder.build(); 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,9 +15,12 @@
15 */ 15 */
16 package org.thingsboard.server.queue.provider; 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import com.google.protobuf.util.JsonFormat;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
  20 +import org.springframework.context.annotation.Bean;
19 import org.springframework.stereotype.Component; 21 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 22 import org.thingsboard.server.common.msg.queue.ServiceType;
  23 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 26 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -25,16 +28,23 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotifica @@ -25,16 +28,23 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotifica
25 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; 28 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
26 import org.thingsboard.server.queue.TbQueueConsumer; 29 import org.thingsboard.server.queue.TbQueueConsumer;
27 import org.thingsboard.server.queue.TbQueueProducer; 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 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
29 import org.thingsboard.server.queue.discovery.PartitionService; 35 import org.thingsboard.server.queue.discovery.PartitionService;
30 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
  37 +import org.thingsboard.server.queue.kafka.TBKafkaAdmin;
31 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate; 38 import org.thingsboard.server.queue.kafka.TBKafkaConsumerTemplate;
32 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate; 39 import org.thingsboard.server.queue.kafka.TBKafkaProducerTemplate;
33 import org.thingsboard.server.queue.kafka.TbKafkaSettings; 40 import org.thingsboard.server.queue.kafka.TbKafkaSettings;
34 import org.thingsboard.server.queue.settings.TbQueueCoreSettings; 41 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  42 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
35 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings; 43 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
36 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration; 44 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
37 45
  46 +import java.nio.charset.StandardCharsets;
  47 +
38 @Component 48 @Component
39 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-rule-engine'") 49 @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-rule-engine'")
40 public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { 50 public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
@@ -44,16 +54,19 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { @@ -44,16 +54,19 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
44 private final TbServiceInfoProvider serviceInfoProvider; 54 private final TbServiceInfoProvider serviceInfoProvider;
45 private final TbQueueCoreSettings coreSettings; 55 private final TbQueueCoreSettings coreSettings;
46 private final TbQueueRuleEngineSettings ruleEngineSettings; 56 private final TbQueueRuleEngineSettings ruleEngineSettings;
  57 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
47 58
48 public KafkaTbRuleEngineQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings, 59 public KafkaTbRuleEngineQueueFactory(PartitionService partitionService, TbKafkaSettings kafkaSettings,
49 TbServiceInfoProvider serviceInfoProvider, 60 TbServiceInfoProvider serviceInfoProvider,
50 TbQueueCoreSettings coreSettings, 61 TbQueueCoreSettings coreSettings,
51 - TbQueueRuleEngineSettings ruleEngineSettings) { 62 + TbQueueRuleEngineSettings ruleEngineSettings,
  63 + TbQueueRemoteJsInvokeSettings jsInvokeSettings) {
52 this.partitionService = partitionService; 64 this.partitionService = partitionService;
53 this.kafkaSettings = kafkaSettings; 65 this.kafkaSettings = kafkaSettings;
54 this.serviceInfoProvider = serviceInfoProvider; 66 this.serviceInfoProvider = serviceInfoProvider;
55 this.coreSettings = coreSettings; 67 this.coreSettings = coreSettings;
56 this.ruleEngineSettings = ruleEngineSettings; 68 this.ruleEngineSettings = ruleEngineSettings;
  69 + this.jsInvokeSettings = jsInvokeSettings;
57 } 70 }
58 71
59 @Override 72 @Override
@@ -124,4 +137,37 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { @@ -124,4 +137,37 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory {
124 consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); 137 consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders()));
125 return consumerBuilder.build(); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -28,6 +29,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse @@ -28,6 +29,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
28 import org.thingsboard.server.queue.TbQueueAdmin; 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 import org.thingsboard.server.queue.TbQueueConsumer; 30 import org.thingsboard.server.queue.TbQueueConsumer;
30 import org.thingsboard.server.queue.TbQueueProducer; 31 import org.thingsboard.server.queue.TbQueueProducer;
  32 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  33 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
31 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 import org.thingsboard.server.queue.discovery.PartitionService; 35 import org.thingsboard.server.queue.discovery.PartitionService;
33 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
@@ -133,4 +136,9 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @@ -133,4 +136,9 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng
133 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() { 136 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
134 return new TbPubSubProducerTemplate<>(admin, pubSubSettings, transportApiSettings.getResponsesTopic()); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -27,6 +28,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM @@ -27,6 +28,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
27 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg; 28 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
28 import org.thingsboard.server.queue.TbQueueAdmin; 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 import org.thingsboard.server.queue.TbQueueConsumer; 30 import org.thingsboard.server.queue.TbQueueConsumer;
  31 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
  32 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
30 import org.thingsboard.server.queue.settings.TbQueueCoreSettings; 33 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
31 import org.thingsboard.server.queue.TbQueueProducer; 34 import org.thingsboard.server.queue.TbQueueProducer;
32 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; 35 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
@@ -110,4 +113,9 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { @@ -110,4 +113,9 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory {
110 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() { 113 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
111 return new TbPubSubProducerTemplate<>(admin, pubSubSettings, coreSettings.getTopic()); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -25,15 +26,17 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotifica @@ -25,15 +26,17 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotifica
25 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; 26 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
26 import org.thingsboard.server.queue.TbQueueAdmin; 27 import org.thingsboard.server.queue.TbQueueAdmin;
27 import org.thingsboard.server.queue.TbQueueConsumer; 28 import org.thingsboard.server.queue.TbQueueConsumer;
28 -import org.thingsboard.server.queue.settings.TbQueueCoreSettings;  
29 import org.thingsboard.server.queue.TbQueueProducer; 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 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 32 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 import org.thingsboard.server.queue.discovery.PartitionService; 33 import org.thingsboard.server.queue.discovery.PartitionService;
33 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 34 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
34 import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; 35 import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate;
35 import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate; 36 import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate;
36 import org.thingsboard.server.queue.pubsub.TbPubSubSettings; 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 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration; 40 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
38 41
39 @Component 42 @Component
@@ -99,4 +102,9 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @@ -99,4 +102,9 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
99 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), 102 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(),
100 msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -28,9 +29,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse @@ -28,9 +29,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
28 import org.thingsboard.server.queue.TbQueueAdmin; 29 import org.thingsboard.server.queue.TbQueueAdmin;
29 import org.thingsboard.server.queue.TbQueueConsumer; 30 import org.thingsboard.server.queue.TbQueueConsumer;
30 import org.thingsboard.server.queue.TbQueueProducer; 31 import org.thingsboard.server.queue.TbQueueProducer;
  32 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
31 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate; 33 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate;
32 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate; 34 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate;
33 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; 35 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings;
  36 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
34 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 37 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
35 import org.thingsboard.server.queue.discovery.PartitionService; 38 import org.thingsboard.server.queue.discovery.PartitionService;
36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 39 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
@@ -131,4 +134,9 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul @@ -131,4 +134,9 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul
131 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() { 134 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
132 return new TbServiceBusProducerTemplate<>(admin, serviceBusSettings, transportApiSettings.getResponsesTopic()); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos; 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -27,9 +28,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse @@ -27,9 +28,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse
27 import org.thingsboard.server.queue.TbQueueAdmin; 28 import org.thingsboard.server.queue.TbQueueAdmin;
28 import org.thingsboard.server.queue.TbQueueConsumer; 29 import org.thingsboard.server.queue.TbQueueConsumer;
29 import org.thingsboard.server.queue.TbQueueProducer; 30 import org.thingsboard.server.queue.TbQueueProducer;
  31 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
30 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate; 32 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate;
31 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate; 33 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate;
32 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; 34 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings;
  35 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
33 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 36 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
34 import org.thingsboard.server.queue.discovery.PartitionService; 37 import org.thingsboard.server.queue.discovery.PartitionService;
35 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 38 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
@@ -39,7 +42,7 @@ import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; @@ -39,7 +42,7 @@ import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
39 42
40 @Component 43 @Component
41 @ConditionalOnExpression("'${queue.type:null}'=='service-bus' && '${service.type:null}'=='tb-core'") 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 private final TbServiceBusSettings serviceBusSettings; 47 private final TbServiceBusSettings serviceBusSettings;
45 private final TbQueueRuleEngineSettings ruleEngineSettings; 48 private final TbQueueRuleEngineSettings ruleEngineSettings;
@@ -49,13 +52,13 @@ public class ServiceBusTbCoreQueueProvider implements TbCoreQueueFactory { @@ -49,13 +52,13 @@ public class ServiceBusTbCoreQueueProvider implements TbCoreQueueFactory {
49 private final TbServiceInfoProvider serviceInfoProvider; 52 private final TbServiceInfoProvider serviceInfoProvider;
50 private final TbQueueAdmin admin; 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 this.serviceBusSettings = serviceBusSettings; 62 this.serviceBusSettings = serviceBusSettings;
60 this.coreSettings = coreSettings; 63 this.coreSettings = coreSettings;
61 this.transportApiSettings = transportApiSettings; 64 this.transportApiSettings = transportApiSettings;
@@ -113,4 +116,9 @@ public class ServiceBusTbCoreQueueProvider implements TbCoreQueueFactory { @@ -113,4 +116,9 @@ public class ServiceBusTbCoreQueueProvider implements TbCoreQueueFactory {
113 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() { 116 public TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer() {
114 return new TbServiceBusProducerTemplate<>(admin, serviceBusSettings, coreSettings.getTopic()); 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,6 +18,7 @@ package org.thingsboard.server.queue.provider;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.thingsboard.server.common.msg.queue.ServiceType; 20 import org.thingsboard.server.common.msg.queue.ServiceType;
  21 +import org.thingsboard.server.gen.js.JsInvokeProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos; 22 import org.thingsboard.server.gen.transport.TransportProtos;
22 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
@@ -25,9 +26,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; @@ -25,9 +26,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 import org.thingsboard.server.queue.TbQueueAdmin; 26 import org.thingsboard.server.queue.TbQueueAdmin;
26 import org.thingsboard.server.queue.TbQueueConsumer; 27 import org.thingsboard.server.queue.TbQueueConsumer;
27 import org.thingsboard.server.queue.TbQueueProducer; 28 import org.thingsboard.server.queue.TbQueueProducer;
  29 +import org.thingsboard.server.queue.TbQueueRequestTemplate;
28 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate; 30 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusConsumerTemplate;
29 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate; 31 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplate;
30 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; 32 import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings;
  33 +import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
31 import org.thingsboard.server.queue.common.TbProtoQueueMsg; 34 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
32 import org.thingsboard.server.queue.discovery.PartitionService; 35 import org.thingsboard.server.queue.discovery.PartitionService;
33 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; 36 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
@@ -96,4 +99,9 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact @@ -96,4 +99,9 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact
96 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), 99 partitionService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(),
97 msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); 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 +15,19 @@
15 */ 15 */
16 package org.thingsboard.server.queue.provider; 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 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 19 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
  20 +import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 21 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
  22 +import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
24 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg;
26 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg; 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 * Responsible for initialization of various Producers and Consumers used by TB Core Node. 33 * Responsible for initialization of various Producers and Consumers used by TB Core Node.
@@ -94,5 +98,5 @@ public interface TbCoreQueueFactory { @@ -94,5 +98,5 @@ public interface TbCoreQueueFactory {
94 */ 98 */
95 TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer(); 99 TbQueueProducer<TbProtoQueueMsg<TransportApiResponseMsg>> createTransportApiResponseProducer();
96 100
97 - 101 + TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate();
98 } 102 }
@@ -15,14 +15,17 @@ @@ -15,14 +15,17 @@
15 */ 15 */
16 package org.thingsboard.server.queue.provider; 16 package org.thingsboard.server.queue.provider;
17 17
  18 +import org.thingsboard.server.gen.js.JsInvokeProtos;
18 import org.thingsboard.server.gen.transport.TransportProtos; 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 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; 20 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
23 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; 21 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
24 -import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;  
25 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg; 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 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration; 29 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
27 30
28 /** 31 /**
@@ -82,4 +85,5 @@ public interface TbRuleEngineQueueFactory { @@ -82,4 +85,5 @@ public interface TbRuleEngineQueueFactory {
82 */ 85 */
83 TbQueueConsumer<TbProtoQueueMsg<ToRuleEngineNotificationMsg>> createToRuleEngineNotificationsMsgConsumer(); 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,6 +19,7 @@ const COMPILATION_ERROR = 0;
19 const RUNTIME_ERROR = 1; 19 const RUNTIME_ERROR = 1;
20 const TIMEOUT_ERROR = 2; 20 const TIMEOUT_ERROR = 2;
21 const UNRECOGNIZED = -1; 21 const UNRECOGNIZED = -1;
  22 +let headers;
22 23
23 const config = require('config'), 24 const config = require('config'),
24 logger = require('../config/logger')._logger('JsInvokeMessageProcessor'), 25 logger = require('../config/logger')._logger('JsInvokeMessageProcessor'),
@@ -43,6 +44,7 @@ JsInvokeMessageProcessor.prototype.onJsInvokeMessage = function(message) { @@ -43,6 +44,7 @@ JsInvokeMessageProcessor.prototype.onJsInvokeMessage = function(message) {
43 var responseTopic; 44 var responseTopic;
44 try { 45 try {
45 var request = JSON.parse(message.value.toString('utf8')); 46 var request = JSON.parse(message.value.toString('utf8'));
  47 + headers = message.headers;
46 var buf = message.headers['requestId']; 48 var buf = message.headers['requestId'];
47 requestId = Utils.UUIDFromBuffer(buf); 49 requestId = Utils.UUIDFromBuffer(buf);
48 buf = message.headers['responseTopic']; 50 buf = message.headers['responseTopic'];
@@ -148,7 +150,8 @@ JsInvokeMessageProcessor.prototype.sendResponse = function (requestId, responseT @@ -148,7 +150,8 @@ JsInvokeMessageProcessor.prototype.sendResponse = function (requestId, responseT
148 messages: [ 150 messages: [
149 { 151 {
150 key: scriptId, 152 key: scriptId,
151 - value: rawResponse 153 + value: rawResponse,
  154 + headers: headers
152 } 155 }
153 ] 156 ]
154 } 157 }