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;
|
||||
|
||||
// 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.defaultTopic = defaultTopic;
|
||||
this.admin = admin;
|
||||
|
||||
@ -34,8 +34,8 @@ public class ThingsBoardForkJoinWorkerThreadFactory implements ForkJoinPool.Fork
|
||||
@Override
|
||||
public final ForkJoinWorkerThread newThread(ForkJoinPool pool) {
|
||||
ForkJoinWorkerThread thread = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
|
||||
thread.setContextClassLoader(this.getClass().getClassLoader());
|
||||
thread.setName(namePrefix +"-"+thread.getPoolIndex()+"-"+threadNumber.getAndIncrement());
|
||||
return thread;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -75,8 +75,8 @@ public class TbKafkaNode implements TbNode {
|
||||
Properties properties = new Properties();
|
||||
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.VALUE_SERIALIZER_CLASS_CONFIG, getKafkaSerializerClass(config.getValueSerializer()));
|
||||
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, getKafkaSerializerClass(config.getKeySerializer()));
|
||||
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, config.getValueSerializer());
|
||||
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, config.getKeySerializer());
|
||||
properties.put(ProducerConfig.ACKS_CONFIG, config.getAcks());
|
||||
properties.put(ProducerConfig.RETRIES_CONFIG, config.getRetries());
|
||||
properties.put(ProducerConfig.BATCH_SIZE_CONFIG, config.getBatchSize());
|
||||
@ -88,28 +88,12 @@ public class TbKafkaNode implements TbNode {
|
||||
addMetadataKeyValuesAsKafkaHeaders = BooleanUtils.toBooleanDefaultIfNull(config.isAddMetadataKeyValuesAsKafkaHeaders(), false);
|
||||
toBytesCharset = config.getKafkaHeadersCharset() != null ? Charset.forName(config.getKafkaHeadersCharset()) : StandardCharsets.UTF_8;
|
||||
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);
|
||||
} catch (Exception 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
|
||||
public void onMsg(TbContext ctx, TbMsg msg) {
|
||||
String topic = TbNodeUtils.processPattern(config.getTopicPattern(), msg);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user