No more protobuf in JS executor

This commit is contained in:
Andrew Shvayka 2019-12-03 12:38:52 +02:00
parent 8569b7dac2
commit 5fe40b70b3
8 changed files with 25 additions and 70 deletions

View File

@ -101,22 +101,6 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
requestBuilder.clientId("producer-js-invoke-" + nodeIdProvider.getNodeId()); requestBuilder.clientId("producer-js-invoke-" + nodeIdProvider.getNodeId());
requestBuilder.defaultTopic(requestTopic); requestBuilder.defaultTopic(requestTopic);
requestBuilder.encoder(new RemoteJsRequestEncoder()); requestBuilder.encoder(new RemoteJsRequestEncoder());
requestBuilder.enricher((request, responseTopic, requestId) -> {
JsInvokeProtos.RemoteJsRequest.Builder remoteRequest = JsInvokeProtos.RemoteJsRequest.newBuilder();
if (request.hasCompileRequest()) {
remoteRequest.setCompileRequest(request.getCompileRequest());
}
if (request.hasInvokeRequest()) {
remoteRequest.setInvokeRequest(request.getInvokeRequest());
}
if (request.hasReleaseRequest()) {
remoteRequest.setReleaseRequest(request.getReleaseRequest());
}
remoteRequest.setResponseTopic(responseTopic);
remoteRequest.setRequestIdMSB(requestId.getMostSignificantBits());
remoteRequest.setRequestIdLSB(requestId.getLeastSignificantBits());
return remoteRequest.build();
});
TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<JsInvokeProtos.RemoteJsResponse> responseBuilder = TBKafkaConsumerTemplate.builder(); TBKafkaConsumerTemplate.TBKafkaConsumerTemplateBuilder<JsInvokeProtos.RemoteJsResponse> responseBuilder = TBKafkaConsumerTemplate.builder();
responseBuilder.settings(kafkaSettings); responseBuilder.settings(kafkaSettings);

View File

@ -15,15 +15,23 @@
*/ */
package org.thingsboard.server.service.script; package org.thingsboard.server.service.script;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import org.thingsboard.server.gen.js.JsInvokeProtos; import org.thingsboard.server.gen.js.JsInvokeProtos;
import org.thingsboard.server.kafka.TbKafkaEncoder; import org.thingsboard.server.kafka.TbKafkaEncoder;
import java.nio.charset.StandardCharsets;
/** /**
* Created by ashvayka on 25.09.18. * Created by ashvayka on 25.09.18.
*/ */
public class RemoteJsRequestEncoder implements TbKafkaEncoder<JsInvokeProtos.RemoteJsRequest> { public class RemoteJsRequestEncoder implements TbKafkaEncoder<JsInvokeProtos.RemoteJsRequest> {
@Override @Override
public byte[] encode(JsInvokeProtos.RemoteJsRequest value) { public byte[] encode(JsInvokeProtos.RemoteJsRequest value) {
return value.toByteArray(); try {
return JsonFormat.printer().print(value).getBytes(StandardCharsets.UTF_8);
} catch (InvalidProtocolBufferException e) {
throw new RuntimeException(e);
}
} }
} }

View File

@ -15,10 +15,12 @@
*/ */
package org.thingsboard.server.service.script; package org.thingsboard.server.service.script;
import com.google.protobuf.util.JsonFormat;
import org.thingsboard.server.gen.js.JsInvokeProtos; import org.thingsboard.server.gen.js.JsInvokeProtos;
import org.thingsboard.server.kafka.TbKafkaDecoder; import org.thingsboard.server.kafka.TbKafkaDecoder;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
/** /**
* Created by ashvayka on 25.09.18. * Created by ashvayka on 25.09.18.
@ -27,6 +29,8 @@ public class RemoteJsResponseDecoder implements TbKafkaDecoder<JsInvokeProtos.Re
@Override @Override
public JsInvokeProtos.RemoteJsResponse decode(byte[] data) throws IOException { public JsInvokeProtos.RemoteJsResponse decode(byte[] data) throws IOException {
return JsInvokeProtos.RemoteJsResponse.parseFrom(data); JsInvokeProtos.RemoteJsResponse.Builder builder = JsInvokeProtos.RemoteJsResponse.newBuilder();
JsonFormat.parser().ignoringUnknownFields().merge(new String(data, StandardCharsets.UTF_8), builder);
return builder.build();
} }
} }

View File

@ -26,12 +26,9 @@ enum JsInvokeErrorCode {
} }
message RemoteJsRequest { message RemoteJsRequest {
string responseTopic = 1; JsCompileRequest compileRequest = 1;
int64 requestIdMSB = 2; JsInvokeRequest invokeRequest = 2;
int64 requestIdLSB = 3; JsReleaseRequest releaseRequest = 3;
JsCompileRequest compileRequest = 4;
JsInvokeRequest invokeRequest = 5;
JsReleaseRequest releaseRequest = 6;
} }
message RemoteJsResponse { message RemoteJsResponse {

View File

@ -49,9 +49,6 @@ public class TBKafkaProducerTemplate<T> {
private final KafkaProducer<String, byte[]> producer; private final KafkaProducer<String, byte[]> producer;
private final TbKafkaEncoder<T> encoder; private final TbKafkaEncoder<T> encoder;
@Builder.Default
private TbKafkaEnricher<T> enricher = ((value, responseTopic, requestId) -> value);
private final TbKafkaPartitioner<T> partitioner; private final TbKafkaPartitioner<T> partitioner;
private ConcurrentMap<String, List<PartitionInfo>> partitionInfoMap; private ConcurrentMap<String, List<PartitionInfo>> partitionInfoMap;
@Getter @Getter
@ -61,7 +58,7 @@ public class TBKafkaProducerTemplate<T> {
private final TbKafkaSettings settings; private final TbKafkaSettings settings;
@Builder @Builder
private TBKafkaProducerTemplate(TbKafkaSettings settings, TbKafkaEncoder<T> encoder, TbKafkaEnricher<T> enricher, private TBKafkaProducerTemplate(TbKafkaSettings settings, TbKafkaEncoder<T> encoder,
TbKafkaPartitioner<T> partitioner, String defaultTopic, String clientId) { TbKafkaPartitioner<T> partitioner, String defaultTopic, String clientId) {
Properties props = settings.toProps(); Properties props = settings.toProps();
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
@ -72,7 +69,6 @@ public class TBKafkaProducerTemplate<T> {
this.settings = settings; this.settings = settings;
this.producer = new KafkaProducer<>(props); this.producer = new KafkaProducer<>(props);
this.encoder = encoder; this.encoder = encoder;
this.enricher = enricher;
this.partitioner = partitioner; this.partitioner = partitioner;
this.defaultTopic = defaultTopic; this.defaultTopic = defaultTopic;
} }
@ -93,14 +89,6 @@ public class TBKafkaProducerTemplate<T> {
} }
} }
T enrich(T value, String responseTopic, UUID requestId) {
if (enricher != null) {
return enricher.enrich(value, responseTopic, requestId);
} else {
return value;
}
}
public Future<RecordMetadata> send(String key, T value, Callback callback) { public Future<RecordMetadata> send(String key, T value, Callback callback) {
return send(key, value, null, callback); return send(key, value, null, callback);
} }

View File

@ -1,24 +0,0 @@
/**
* Copyright © 2016-2019 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.kafka;
import java.util.UUID;
public interface TbKafkaEnricher<T> {
T enrich(T value, String responseTopic, UUID requestId);
}

View File

@ -144,11 +144,11 @@ public class TbKafkaRequestTemplate<Request, Response> extends AbstractTbKafkaTe
tickSize = pendingRequests.size(); tickSize = pendingRequests.size();
if (nextCleanupMs < tickTs) { if (nextCleanupMs < tickTs) {
//cleanup; //cleanup;
pendingRequests.entrySet().forEach(kv -> { pendingRequests.forEach((key, value) -> {
if (kv.getValue().expTime < tickTs) { if (value.expTime < tickTs) {
ResponseMetaData<Response> staleRequest = pendingRequests.remove(kv.getKey()); ResponseMetaData<Response> staleRequest = pendingRequests.remove(key);
if (staleRequest != null) { if (staleRequest != null) {
log.trace("[{}] Request timeout detected, expTime [{}], tickTs [{}]", kv.getKey(), staleRequest.expTime, tickTs); log.trace("[{}] Request timeout detected, expTime [{}], tickTs [{}]", key, staleRequest.expTime, tickTs);
staleRequest.future.setException(new TimeoutException()); staleRequest.future.setException(new TimeoutException());
} }
} }
@ -189,13 +189,12 @@ public class TbKafkaRequestTemplate<Request, Response> extends AbstractTbKafkaTe
SettableFuture<Response> future = SettableFuture.create(); SettableFuture<Response> future = SettableFuture.create();
ResponseMetaData<Response> responseMetaData = new ResponseMetaData<>(tickTs + maxRequestTimeout, future); ResponseMetaData<Response> responseMetaData = new ResponseMetaData<>(tickTs + maxRequestTimeout, future);
pendingRequests.putIfAbsent(requestId, responseMetaData); pendingRequests.putIfAbsent(requestId, responseMetaData);
request = requestTemplate.enrich(request, responseTemplate.getTopic(), requestId);
log.trace("[{}] Sending request, key [{}], expTime [{}]", requestId, key, responseMetaData.expTime); log.trace("[{}] Sending request, key [{}], expTime [{}]", requestId, key, responseMetaData.expTime);
requestTemplate.send(key, request, headers, (metadata, exception) -> { requestTemplate.send(key, request, headers, (metadata, exception) -> {
if (exception != null) { if (exception != null) {
log.trace("[{}] Failed to post the request", requestId, exception); log.trace("[{}] Failed to post the request", requestId, exception);
} else { } else {
log.trace("[{}] Posted the request", requestId, metadata); log.trace("[{}] Posted the request: {}", requestId, metadata);
} }
}); });
return future; return future;

View File

@ -32,9 +32,8 @@ import java.util.Properties;
@Component @Component
public class TbKafkaSettings { public class TbKafkaSettings {
public static final String REQUEST_ID_HEADER = "requestId"; static final String REQUEST_ID_HEADER = "requestId";
public static final String RESPONSE_TOPIC_HEADER = "responseTopic"; static final String RESPONSE_TOPIC_HEADER = "responseTopic";
@Value("${kafka.bootstrap.servers}") @Value("${kafka.bootstrap.servers}")
private String servers; private String servers;