Commit 1dd3334825212603da640af693f1f95e274943c5
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 | } | ... | ... |
common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.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; |
... | ... | @@ -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 | } | ... | ... |
common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.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.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 | } | ... | ... |
common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.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.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 | } | ... | ... |
common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java
0 → 100644
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 | } | ... | ... |