|
|
|
@ -15,7 +15,9 @@ |
|
|
|
*/ |
|
|
|
package org.thingsboard.server.queue.provider; |
|
|
|
|
|
|
|
import com.google.protobuf.util.JsonFormat; |
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; |
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
import org.thingsboard.server.common.msg.queue.ServiceType; |
|
|
|
import org.thingsboard.server.gen.js.JsInvokeProtos; |
|
|
|
@ -28,21 +30,24 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM |
|
|
|
import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg; |
|
|
|
import org.thingsboard.server.queue.TbQueueAdmin; |
|
|
|
import org.thingsboard.server.queue.TbQueueConsumer; |
|
|
|
import org.thingsboard.server.queue.TbQueueProducer; |
|
|
|
import org.thingsboard.server.queue.TbQueueRequestTemplate; |
|
|
|
import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; |
|
|
|
import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; |
|
|
|
import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; |
|
|
|
import org.thingsboard.server.queue.pubsub.TbPubSubSubscriptionSettings; |
|
|
|
import org.thingsboard.server.queue.settings.TbQueueCoreSettings; |
|
|
|
import org.thingsboard.server.queue.TbQueueProducer; |
|
|
|
import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; |
|
|
|
import org.thingsboard.server.queue.common.TbProtoQueueMsg; |
|
|
|
import org.thingsboard.server.queue.discovery.PartitionService; |
|
|
|
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; |
|
|
|
import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; |
|
|
|
import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; |
|
|
|
import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate; |
|
|
|
import org.thingsboard.server.queue.pubsub.TbPubSubSettings; |
|
|
|
import org.thingsboard.server.queue.pubsub.TbPubSubSubscriptionSettings; |
|
|
|
import org.thingsboard.server.queue.settings.TbQueueCoreSettings; |
|
|
|
import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; |
|
|
|
import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; |
|
|
|
|
|
|
|
import javax.annotation.PreDestroy; |
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
|
|
|
|
|
@Component |
|
|
|
@ConditionalOnExpression("'${queue.type:null}'=='pubsub' && '${service.type:null}'=='tb-core'") |
|
|
|
@ -53,6 +58,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { |
|
|
|
private final TbQueueTransportApiSettings transportApiSettings; |
|
|
|
private final PartitionService partitionService; |
|
|
|
private final TbServiceInfoProvider serviceInfoProvider; |
|
|
|
private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; |
|
|
|
|
|
|
|
private final TbQueueAdmin coreAdmin; |
|
|
|
private final TbQueueAdmin jsExecutorAdmin; |
|
|
|
@ -64,12 +70,14 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { |
|
|
|
TbQueueTransportApiSettings transportApiSettings, |
|
|
|
PartitionService partitionService, |
|
|
|
TbServiceInfoProvider serviceInfoProvider, |
|
|
|
TbQueueRemoteJsInvokeSettings jsInvokeSettings, |
|
|
|
TbPubSubSubscriptionSettings pubSubSubscriptionSettings) { |
|
|
|
this.pubSubSettings = pubSubSettings; |
|
|
|
this.coreSettings = coreSettings; |
|
|
|
this.transportApiSettings = transportApiSettings; |
|
|
|
this.partitionService = partitionService; |
|
|
|
this.serviceInfoProvider = serviceInfoProvider; |
|
|
|
this.jsInvokeSettings = jsInvokeSettings; |
|
|
|
|
|
|
|
this.coreAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getCoreSettings()); |
|
|
|
this.jsExecutorAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getJsExecutorSettings()); |
|
|
|
@ -127,8 +135,26 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Bean |
|
|
|
public TbQueueRequestTemplate<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> createRemoteJsRequestTemplate() { |
|
|
|
return null; |
|
|
|
TbQueueProducer<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>> producer = new TbPubSubProducerTemplate<>(jsExecutorAdmin, pubSubSettings, jsInvokeSettings.getRequestTopic()); |
|
|
|
TbQueueConsumer<TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> consumer = new TbPubSubConsumerTemplate<>(jsExecutorAdmin, pubSubSettings, |
|
|
|
jsInvokeSettings.getResponseTopic() + "." + serviceInfoProvider.getServiceId(), |
|
|
|
msg -> { |
|
|
|
JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder(); |
|
|
|
JsonFormat.parser().ignoringUnknownFields().merge(new String(msg.getData(), StandardCharsets.UTF_8), builder); |
|
|
|
return new TbProtoQueueMsg<>(msg.getKey(), builder.build(), msg.getHeaders()); |
|
|
|
}); |
|
|
|
|
|
|
|
DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder |
|
|
|
<TbProtoJsQueueMsg<JsInvokeProtos.RemoteJsRequest>, TbProtoQueueMsg<JsInvokeProtos.RemoteJsResponse>> builder = DefaultTbQueueRequestTemplate.builder(); |
|
|
|
builder.queueAdmin(jsExecutorAdmin); |
|
|
|
builder.requestTemplate(producer); |
|
|
|
builder.responseTemplate(consumer); |
|
|
|
builder.maxPendingRequests(jsInvokeSettings.getMaxPendingRequests()); |
|
|
|
builder.maxRequestTimeout(jsInvokeSettings.getMaxRequestsTimeout()); |
|
|
|
builder.pollInterval(jsInvokeSettings.getResponsePollInterval()); |
|
|
|
return builder.build(); |
|
|
|
} |
|
|
|
|
|
|
|
@PreDestroy |
|
|
|
|