Commit cce6a44adc8a701ec0c08b7bfe91ff6f5388c138

Authored by YevhenBondarenko
1 parent ef35ee8c

refactored queue factories

... ... @@ -20,7 +20,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
20 20 import org.springframework.context.annotation.Bean;
21 21 import org.springframework.stereotype.Component;
22 22 import org.thingsboard.server.common.msg.queue.ServiceType;
23   -import org.thingsboard.server.gen.js.JsInvokeProtos.*;
  23 +import org.thingsboard.server.gen.js.JsInvokeProtos.RemoteJsRequest;
  24 +import org.thingsboard.server.gen.js.JsInvokeProtos.RemoteJsResponse;
24 25 import org.thingsboard.server.gen.transport.TransportProtos;
25 26 import org.thingsboard.server.queue.TbQueueAdmin;
26 27 import org.thingsboard.server.queue.TbQueueConsumer;
... ... @@ -31,8 +32,6 @@ 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   -import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate;
35   -import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate;
36 35 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
37 36 import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
38 37 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
... ...
... ... @@ -15,7 +15,9 @@
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;
21 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
... ... @@ -30,11 +32,13 @@ import org.thingsboard.server.queue.TbQueueAdmin;
30 32 import org.thingsboard.server.queue.TbQueueConsumer;
31 33 import org.thingsboard.server.queue.TbQueueProducer;
32 34 import org.thingsboard.server.queue.TbQueueRequestTemplate;
  35 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
33 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;
37 40 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  41 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
38 42 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
39 43 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
40 44 import org.thingsboard.server.queue.sqs.TbAwsSqsAdmin;
... ... @@ -44,6 +48,7 @@ import org.thingsboard.server.queue.sqs.TbAwsSqsQueueAttributes;
44 48 import org.thingsboard.server.queue.sqs.TbAwsSqsSettings;
45 49
46 50 import javax.annotation.PreDestroy;
  51 +import java.nio.charset.StandardCharsets;
47 52
48 53 @Component
49 54 @ConditionalOnExpression("'${queue.type:null}'=='aws-sqs' && '${service.type:null}'=='tb-core'")
... ... @@ -55,6 +60,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory {
55 60 private final TbQueueTransportApiSettings transportApiSettings;
56 61 private final PartitionService partitionService;
57 62 private final TbServiceInfoProvider serviceInfoProvider;
  63 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
58 64
59 65 private final TbQueueAdmin coreAdmin;
60 66 private final TbQueueAdmin ruleEngineAdmin;
... ... @@ -68,6 +74,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory {
68 74 TbQueueRuleEngineSettings ruleEngineSettings,
69 75 PartitionService partitionService,
70 76 TbServiceInfoProvider serviceInfoProvider,
  77 + TbQueueRemoteJsInvokeSettings jsInvokeSettings,
71 78 TbAwsSqsQueueAttributes sqsQueueAttributes) {
72 79 this.sqsSettings = sqsSettings;
73 80 this.coreSettings = coreSettings;
... ... @@ -75,6 +82,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory {
75 82 this.ruleEngineSettings = ruleEngineSettings;
76 83 this.partitionService = partitionService;
77 84 this.serviceInfoProvider = serviceInfoProvider;
  85 + this.jsInvokeSettings = jsInvokeSettings;
78 86
79 87 this.coreAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getCoreAttributes());
80 88 this.ruleEngineAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getRuleEngineAttributes());
... ... @@ -133,8 +141,26 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory {
133 141 }
134 142
135 143 @Override
  144 + @Bean
136 145 public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
137   - return null;
  146 + TbQueueProducer<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer = new TbAwsSqsProducerTemplate<>(jsExecutorAdmin, sqsSettings, jsInvokeSettings.getRequestTopic());
  147 + TbQueueConsumer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> consumer = new TbAwsSqsConsumerTemplate<>(jsExecutorAdmin, sqsSettings,
  148 + jsInvokeSettings.getResponseTopic() + "_" + serviceInfoProvider.getServiceId(),
  149 + msg -> {
  150 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  151 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  152 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  153 + });
  154 +
  155 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  156 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  157 + builder.queueAdmin(jsExecutorAdmin);
  158 + builder.requestTemplate(producer);
  159 + builder.responseTemplate(consumer);
  160 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  161 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  162 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  163 + return builder.build();
138 164 }
139 165
140 166 @PreDestroy
... ...
... ... @@ -15,7 +15,9 @@
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;
21 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
... ... @@ -27,11 +29,13 @@ import org.thingsboard.server.queue.TbQueueAdmin;
27 29 import org.thingsboard.server.queue.TbQueueConsumer;
28 30 import org.thingsboard.server.queue.TbQueueProducer;
29 31 import org.thingsboard.server.queue.TbQueueRequestTemplate;
  32 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
30 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;
34 37 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  38 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
35 39 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
36 40 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
37 41 import org.thingsboard.server.queue.sqs.TbAwsSqsAdmin;
... ... @@ -41,6 +45,7 @@ import org.thingsboard.server.queue.sqs.TbAwsSqsQueueAttributes;
41 45 import org.thingsboard.server.queue.sqs.TbAwsSqsSettings;
42 46
43 47 import javax.annotation.PreDestroy;
  48 +import java.nio.charset.StandardCharsets;
44 49
45 50 @Component
46 51 @ConditionalOnExpression("'${queue.type:null}'=='aws-sqs' && '${service.type:null}'=='tb-rule-engine'")
... ... @@ -51,6 +56,7 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
51 56 private final TbServiceInfoProvider serviceInfoProvider;
52 57 private final TbQueueRuleEngineSettings ruleEngineSettings;
53 58 private final TbAwsSqsSettings sqsSettings;
  59 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
54 60
55 61 private final TbQueueAdmin coreAdmin;
56 62 private final TbQueueAdmin ruleEngineAdmin;
... ... @@ -61,12 +67,14 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
61 67 TbQueueRuleEngineSettings ruleEngineSettings,
62 68 TbServiceInfoProvider serviceInfoProvider,
63 69 TbAwsSqsSettings sqsSettings,
64   - TbAwsSqsQueueAttributes sqsQueueAttributes) {
  70 + TbAwsSqsQueueAttributes sqsQueueAttributes,
  71 + TbQueueRemoteJsInvokeSettings jsInvokeSettings) {
65 72 this.partitionService = partitionService;
66 73 this.coreSettings = coreSettings;
67 74 this.serviceInfoProvider = serviceInfoProvider;
68 75 this.ruleEngineSettings = ruleEngineSettings;
69 76 this.sqsSettings = sqsSettings;
  77 + this.jsInvokeSettings = jsInvokeSettings;
70 78
71 79 this.coreAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getCoreAttributes());
72 80 this.ruleEngineAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getRuleEngineAttributes());
... ... @@ -113,8 +121,26 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
113 121 }
114 122
115 123 @Override
  124 + @Bean
116 125 public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
117   - return null;
  126 + TbQueueProducer<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer = new TbAwsSqsProducerTemplate<>(jsExecutorAdmin, sqsSettings, jsInvokeSettings.getRequestTopic());
  127 + TbQueueConsumer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> consumer = new TbAwsSqsConsumerTemplate<>(jsExecutorAdmin, sqsSettings,
  128 + jsInvokeSettings.getResponseTopic() + "_" + serviceInfoProvider.getServiceId(),
  129 + msg -> {
  130 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  131 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  132 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  133 + });
  134 +
  135 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  136 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  137 + builder.queueAdmin(jsExecutorAdmin);
  138 + builder.requestTemplate(producer);
  139 + builder.responseTemplate(consumer);
  140 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  141 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  142 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  143 + return builder.build();
118 144 }
119 145
120 146 @PreDestroy
... ...
... ... @@ -15,7 +15,9 @@
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;
21 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
... ... @@ -28,21 +30,24 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
28 30 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
29 31 import org.thingsboard.server.queue.TbQueueAdmin;
30 32 import org.thingsboard.server.queue.TbQueueConsumer;
  33 +import org.thingsboard.server.queue.TbQueueProducer;
31 34 import org.thingsboard.server.queue.TbQueueRequestTemplate;
  35 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
32 36 import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
33   -import org.thingsboard.server.queue.pubsub.TbPubSubAdmin;
34   -import org.thingsboard.server.queue.pubsub.TbPubSubSubscriptionSettings;
35   -import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
36   -import org.thingsboard.server.queue.TbQueueProducer;
37   -import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
38 37 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
39 38 import org.thingsboard.server.queue.discovery.PartitionService;
40 39 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
  40 +import org.thingsboard.server.queue.pubsub.TbPubSubAdmin;
41 41 import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate;
42 42 import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate;
43 43 import org.thingsboard.server.queue.pubsub.TbPubSubSettings;
  44 +import org.thingsboard.server.queue.pubsub.TbPubSubSubscriptionSettings;
  45 +import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  46 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
  47 +import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
44 48
45 49 import javax.annotation.PreDestroy;
  50 +import java.nio.charset.StandardCharsets;
46 51
47 52 @Component
48 53 @ConditionalOnExpression("'${queue.type:null}'=='pubsub' && '${service.type:null}'=='tb-core'")
... ... @@ -53,6 +58,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory {
53 58 private final TbQueueTransportApiSettings transportApiSettings;
54 59 private final PartitionService partitionService;
55 60 private final TbServiceInfoProvider serviceInfoProvider;
  61 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
56 62
57 63 private final TbQueueAdmin coreAdmin;
58 64 private final TbQueueAdmin jsExecutorAdmin;
... ... @@ -64,12 +70,14 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory {
64 70 TbQueueTransportApiSettings transportApiSettings,
65 71 PartitionService partitionService,
66 72 TbServiceInfoProvider serviceInfoProvider,
  73 + TbQueueRemoteJsInvokeSettings jsInvokeSettings,
67 74 TbPubSubSubscriptionSettings pubSubSubscriptionSettings) {
68 75 this.pubSubSettings = pubSubSettings;
69 76 this.coreSettings = coreSettings;
70 77 this.transportApiSettings = transportApiSettings;
71 78 this.partitionService = partitionService;
72 79 this.serviceInfoProvider = serviceInfoProvider;
  80 + this.jsInvokeSettings = jsInvokeSettings;
73 81
74 82 this.coreAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getCoreSettings());
75 83 this.jsExecutorAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getJsExecutorSettings());
... ... @@ -127,8 +135,26 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory {
127 135 }
128 136
129 137 @Override
  138 + @Bean
130 139 public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
131   - return null;
  140 + TbQueueProducer<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer = new TbPubSubProducerTemplate<>(jsExecutorAdmin, pubSubSettings, jsInvokeSettings.getRequestTopic());
  141 + TbQueueConsumer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> consumer = new TbPubSubConsumerTemplate<>(jsExecutorAdmin, pubSubSettings,
  142 + jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId(),
  143 + msg -> {
  144 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  145 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  146 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  147 + });
  148 +
  149 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  150 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  151 + builder.queueAdmin(jsExecutorAdmin);
  152 + builder.requestTemplate(producer);
  153 + builder.responseTemplate(consumer);
  154 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  155 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  156 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  157 + return builder.build();
132 158 }
133 159
134 160 @PreDestroy
... ...
... ... @@ -15,7 +15,9 @@
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;
21 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
... ... @@ -28,6 +30,7 @@ import org.thingsboard.server.queue.TbQueueAdmin;
28 30 import org.thingsboard.server.queue.TbQueueConsumer;
29 31 import org.thingsboard.server.queue.TbQueueProducer;
30 32 import org.thingsboard.server.queue.TbQueueRequestTemplate;
  33 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
31 34 import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
32 35 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
33 36 import org.thingsboard.server.queue.discovery.PartitionService;
... ... @@ -38,10 +41,12 @@ import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate;
38 41 import org.thingsboard.server.queue.pubsub.TbPubSubSettings;
39 42 import org.thingsboard.server.queue.pubsub.TbPubSubSubscriptionSettings;
40 43 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  44 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
41 45 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
42 46 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
43 47
44 48 import javax.annotation.PreDestroy;
  49 +import java.nio.charset.StandardCharsets;
45 50
46 51 @Component
47 52 @ConditionalOnExpression("'${queue.type:null}'=='pubsub' && '${service.type:null}'=='tb-rule-engine'")
... ... @@ -52,6 +57,7 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
52 57 private final TbQueueRuleEngineSettings ruleEngineSettings;
53 58 private final PartitionService partitionService;
54 59 private final TbServiceInfoProvider serviceInfoProvider;
  60 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
55 61
56 62 private final TbQueueAdmin coreAdmin;
57 63 private final TbQueueAdmin ruleEngineAdmin;
... ... @@ -63,12 +69,14 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
63 69 TbQueueRuleEngineSettings ruleEngineSettings,
64 70 PartitionService partitionService,
65 71 TbServiceInfoProvider serviceInfoProvider,
  72 + TbQueueRemoteJsInvokeSettings jsInvokeSettings,
66 73 TbPubSubSubscriptionSettings pubSubSubscriptionSettings) {
67 74 this.pubSubSettings = pubSubSettings;
68 75 this.coreSettings = coreSettings;
69 76 this.ruleEngineSettings = ruleEngineSettings;
70 77 this.partitionService = partitionService;
71 78 this.serviceInfoProvider = serviceInfoProvider;
  79 + this.jsInvokeSettings = jsInvokeSettings;
72 80
73 81 this.coreAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getCoreSettings());
74 82 this.ruleEngineAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getRuleEngineSettings());
... ... @@ -116,8 +124,26 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory
116 124 }
117 125
118 126 @Override
  127 + @Bean
119 128 public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
120   - return null;
  129 + TbQueueProducer<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer = new TbPubSubProducerTemplate<>(jsExecutorAdmin, pubSubSettings, jsInvokeSettings.getRequestTopic());
  130 + TbQueueConsumer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> consumer = new TbPubSubConsumerTemplate<>(jsExecutorAdmin, pubSubSettings,
  131 + jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId(),
  132 + msg -> {
  133 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  134 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  135 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  136 + });
  137 +
  138 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  139 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  140 + builder.queueAdmin(jsExecutorAdmin);
  141 + builder.requestTemplate(producer);
  142 + builder.responseTemplate(consumer);
  143 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  144 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  145 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  146 + return builder.build();
121 147 }
122 148
123 149 @PreDestroy
... ...
... ... @@ -15,7 +15,9 @@
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;
21 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
... ... @@ -30,6 +32,7 @@ import org.thingsboard.server.queue.TbQueueAdmin;
30 32 import org.thingsboard.server.queue.TbQueueConsumer;
31 33 import org.thingsboard.server.queue.TbQueueProducer;
32 34 import org.thingsboard.server.queue.TbQueueRequestTemplate;
  35 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
33 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;
... ... @@ -40,10 +43,12 @@ import org.thingsboard.server.queue.rabbitmq.TbRabbitMqProducerTemplate;
40 43 import org.thingsboard.server.queue.rabbitmq.TbRabbitMqQueueArguments;
41 44 import org.thingsboard.server.queue.rabbitmq.TbRabbitMqSettings;
42 45 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  46 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
43 47 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
44 48 import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings;
45 49
46 50 import javax.annotation.PreDestroy;
  51 +import java.nio.charset.StandardCharsets;
47 52
48 53 @Component
49 54 @ConditionalOnExpression("'${queue.type:null}'=='rabbitmq' && '${service.type:null}'=='tb-core'")
... ... @@ -55,6 +60,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory {
55 60 private final TbQueueTransportApiSettings transportApiSettings;
56 61 private final PartitionService partitionService;
57 62 private final TbServiceInfoProvider serviceInfoProvider;
  63 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
58 64
59 65 private final TbQueueAdmin coreAdmin;
60 66 private final TbQueueAdmin ruleEngineAdmin;
... ... @@ -68,6 +74,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory {
68 74 TbQueueRuleEngineSettings ruleEngineSettings,
69 75 PartitionService partitionService,
70 76 TbServiceInfoProvider serviceInfoProvider,
  77 + TbQueueRemoteJsInvokeSettings jsInvokeSettings,
71 78 TbRabbitMqQueueArguments queueArguments) {
72 79 this.rabbitMqSettings = rabbitMqSettings;
73 80 this.coreSettings = coreSettings;
... ... @@ -75,6 +82,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory {
75 82 this.ruleEngineSettings = ruleEngineSettings;
76 83 this.partitionService = partitionService;
77 84 this.serviceInfoProvider = serviceInfoProvider;
  85 + this.jsInvokeSettings = jsInvokeSettings;
78 86
79 87 this.coreAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getCoreArgs());
80 88 this.ruleEngineAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getRuleEngineArgs());
... ... @@ -133,8 +141,26 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory {
133 141 }
134 142
135 143 @Override
  144 + @Bean
136 145 public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
137   - return null;
  146 + TbQueueProducer<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer = new TbRabbitMqProducerTemplate<>(jsExecutorAdmin, rabbitMqSettings, jsInvokeSettings.getRequestTopic());
  147 + TbQueueConsumer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> consumer = new TbRabbitMqConsumerTemplate<>(jsExecutorAdmin, rabbitMqSettings,
  148 + jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId(),
  149 + msg -> {
  150 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  151 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  152 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  153 + });
  154 +
  155 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  156 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  157 + builder.queueAdmin(jsExecutorAdmin);
  158 + builder.requestTemplate(producer);
  159 + builder.responseTemplate(consumer);
  160 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  161 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  162 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  163 + return builder.build();
138 164 }
139 165
140 166 @PreDestroy
... ...
... ... @@ -15,7 +15,9 @@
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;
21 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
... ... @@ -28,6 +30,7 @@ import org.thingsboard.server.queue.TbQueueAdmin;
28 30 import org.thingsboard.server.queue.TbQueueConsumer;
29 31 import org.thingsboard.server.queue.TbQueueProducer;
30 32 import org.thingsboard.server.queue.TbQueueRequestTemplate;
  33 +import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate;
31 34 import org.thingsboard.server.queue.common.TbProtoJsQueueMsg;
32 35 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
33 36 import org.thingsboard.server.queue.discovery.PartitionService;
... ... @@ -38,10 +41,12 @@ import org.thingsboard.server.queue.rabbitmq.TbRabbitMqProducerTemplate;
38 41 import org.thingsboard.server.queue.rabbitmq.TbRabbitMqQueueArguments;
39 42 import org.thingsboard.server.queue.rabbitmq.TbRabbitMqSettings;
40 43 import org.thingsboard.server.queue.settings.TbQueueCoreSettings;
  44 +import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings;
41 45 import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
42 46 import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
43 47
44 48 import javax.annotation.PreDestroy;
  49 +import java.nio.charset.StandardCharsets;
45 50
46 51 @Component
47 52 @ConditionalOnExpression("'${queue.type:null}'=='rabbitmq' && '${service.type:null}'=='tb-rule-engine'")
... ... @@ -52,6 +57,7 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor
52 57 private final TbServiceInfoProvider serviceInfoProvider;
53 58 private final TbQueueRuleEngineSettings ruleEngineSettings;
54 59 private final TbRabbitMqSettings rabbitMqSettings;
  60 + private final TbQueueRemoteJsInvokeSettings jsInvokeSettings;
55 61
56 62 private final TbQueueAdmin coreAdmin;
57 63 private final TbQueueAdmin ruleEngineAdmin;
... ... @@ -62,12 +68,14 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor
62 68 TbQueueRuleEngineSettings ruleEngineSettings,
63 69 TbServiceInfoProvider serviceInfoProvider,
64 70 TbRabbitMqSettings rabbitMqSettings,
  71 + TbQueueRemoteJsInvokeSettings jsInvokeSettings,
65 72 TbRabbitMqQueueArguments queueArguments) {
66 73 this.partitionService = partitionService;
67 74 this.coreSettings = coreSettings;
68 75 this.serviceInfoProvider = serviceInfoProvider;
69 76 this.ruleEngineSettings = ruleEngineSettings;
70 77 this.rabbitMqSettings = rabbitMqSettings;
  78 + this.jsInvokeSettings = jsInvokeSettings;
71 79
72 80 this.coreAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getCoreArgs());
73 81 this.ruleEngineAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getRuleEngineArgs());
... ... @@ -114,8 +122,26 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor
114 122 }
115 123
116 124 @Override
  125 + @Bean
117 126 public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() {
118   - return null;
  127 + TbQueueProducer<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer = new TbRabbitMqProducerTemplate<>(jsExecutorAdmin, rabbitMqSettings, jsInvokeSettings.getRequestTopic());
  128 + TbQueueConsumer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> consumer = new TbRabbitMqConsumerTemplate<>(jsExecutorAdmin, rabbitMqSettings,
  129 + jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId(),
  130 + msg -> {
  131 + JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
  132 + JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder);
  133 + return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders());
  134 + });
  135 +
  136 + DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder
  137 + <TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder();
  138 + builder.queueAdmin(jsExecutorAdmin);
  139 + builder.requestTemplate(producer);
  140 + builder.responseTemplate(consumer);
  141 + builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests());
  142 + builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout());
  143 + builder.pollInterval(jsInvokeSettings.getResponsePollInterval());
  144 + return builder.build();
119 145 }
120 146
121 147 @PreDestroy
... ...