Fix fork join pool - use current classloader for thread context classloader instead of system
This commit is contained in:
parent
266ab23380
commit
e2f2605197
@ -62,9 +62,6 @@ public class TbKafkaProducerTemplate<T extends TbQueueMsg> implements TbQueuePro
|
|||||||
}
|
}
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
|
|
||||||
// Ugly workaround to fix org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: unable to find LoginModule class
|
|
||||||
// details: https://stackoverflow.com/questions/57574901/kafka-java-client-classloader-doesnt-find-sasl-scram-login-class
|
|
||||||
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
|
|
||||||
this.producer = new KafkaProducer<>(props);
|
this.producer = new KafkaProducer<>(props);
|
||||||
this.defaultTopic = defaultTopic;
|
this.defaultTopic = defaultTopic;
|
||||||
this.admin = admin;
|
this.admin = admin;
|
||||||
|
|||||||
@ -34,8 +34,8 @@ public class ThingsBoardForkJoinWorkerThreadFactory implements ForkJoinPool.Fork
|
|||||||
@Override
|
@Override
|
||||||
public final ForkJoinWorkerThread newThread(ForkJoinPool pool) {
|
public final ForkJoinWorkerThread newThread(ForkJoinPool pool) {
|
||||||
ForkJoinWorkerThread thread = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
|
ForkJoinWorkerThread thread = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
|
||||||
|
thread.setContextClassLoader(this.getClass().getClassLoader());
|
||||||
thread.setName(namePrefix +"-"+thread.getPoolIndex()+"-"+threadNumber.getAndIncrement());
|
thread.setName(namePrefix +"-"+thread.getPoolIndex()+"-"+threadNumber.getAndIncrement());
|
||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -75,8 +75,8 @@ public class TbKafkaNode implements TbNode {
|
|||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
properties.put(ProducerConfig.CLIENT_ID_CONFIG, "producer-tb-kafka-node-" + ctx.getSelfId().getId().toString() + "-" + ctx.getServiceId());
|
properties.put(ProducerConfig.CLIENT_ID_CONFIG, "producer-tb-kafka-node-" + ctx.getSelfId().getId().toString() + "-" + ctx.getServiceId());
|
||||||
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, config.getBootstrapServers());
|
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, config.getBootstrapServers());
|
||||||
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, getKafkaSerializerClass(config.getValueSerializer()));
|
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, config.getValueSerializer());
|
||||||
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, getKafkaSerializerClass(config.getKeySerializer()));
|
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, config.getKeySerializer());
|
||||||
properties.put(ProducerConfig.ACKS_CONFIG, config.getAcks());
|
properties.put(ProducerConfig.ACKS_CONFIG, config.getAcks());
|
||||||
properties.put(ProducerConfig.RETRIES_CONFIG, config.getRetries());
|
properties.put(ProducerConfig.RETRIES_CONFIG, config.getRetries());
|
||||||
properties.put(ProducerConfig.BATCH_SIZE_CONFIG, config.getBatchSize());
|
properties.put(ProducerConfig.BATCH_SIZE_CONFIG, config.getBatchSize());
|
||||||
@ -88,28 +88,12 @@ public class TbKafkaNode implements TbNode {
|
|||||||
addMetadataKeyValuesAsKafkaHeaders = BooleanUtils.toBooleanDefaultIfNull(config.isAddMetadataKeyValuesAsKafkaHeaders(), false);
|
addMetadataKeyValuesAsKafkaHeaders = BooleanUtils.toBooleanDefaultIfNull(config.isAddMetadataKeyValuesAsKafkaHeaders(), false);
|
||||||
toBytesCharset = config.getKafkaHeadersCharset() != null ? Charset.forName(config.getKafkaHeadersCharset()) : StandardCharsets.UTF_8;
|
toBytesCharset = config.getKafkaHeadersCharset() != null ? Charset.forName(config.getKafkaHeadersCharset()) : StandardCharsets.UTF_8;
|
||||||
try {
|
try {
|
||||||
// Ugly workaround to fix org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: unable to find LoginModule class
|
|
||||||
// details: https://stackoverflow.com/questions/57574901/kafka-java-client-classloader-doesnt-find-sasl-scram-login-class
|
|
||||||
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
|
|
||||||
this.producer = new KafkaProducer<>(properties);
|
this.producer = new KafkaProducer<>(properties);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new TbNodeException(e);
|
throw new TbNodeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Class<?> getKafkaSerializerClass(String serializerClassName) {
|
|
||||||
Class<?> serializerClass = null;
|
|
||||||
if (!StringUtils.isEmpty(serializerClassName)) {
|
|
||||||
try {
|
|
||||||
serializerClass = Class.forName(serializerClassName);
|
|
||||||
} catch (ClassNotFoundException e) {}
|
|
||||||
}
|
|
||||||
if (serializerClass == null) {
|
|
||||||
serializerClass = StringSerializer.class;
|
|
||||||
}
|
|
||||||
return serializerClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMsg(TbContext ctx, TbMsg msg) {
|
public void onMsg(TbContext ctx, TbMsg msg) {
|
||||||
String topic = TbNodeUtils.processPattern(config.getTopicPattern(), msg);
|
String topic = TbNodeUtils.processPattern(config.getTopicPattern(), msg);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user