java - 卡夫卡Java客户端: ClassLoader doesn't find SASL/Scram Login Class

标签 java apache-kafka jboss wildfly keycloak

构建一个 SPI 将事件推送到 Kafka 中,以便在 Keycloak 6.0.1 中部署为 EAR>,它使用 WildFly 服务器,打包在基于 jboss/keycloak:6.0.1Docker 镜像中。

我遇到了:Kafka Producer - org.apache.kafka.common.serialization.StringSerializer could not be found

所以我应用了建议的设置Thread.currentThread().setContextClassLoader(null);的解决方案。

这对于我在端口 9092 上的本地 Kafka 来说似乎工作得很好,无需身份验证。一旦我按照描述进行身份验证 here :

String jaasTemplate = "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"%s\" password=\"%s\";";
String jaasCfg = String.format(jaasTemplate, username, password);

Properties props = new Properties();
props.put("sasl.jaas.config", jaasCfg);
// ...
Thread.currentThread().setContextClassLoader(null);
KafkaProducer<String, String> producer = new KafkaProducer<>(props);

我遇到了错误:

org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: unable to find LoginModule class: org.apache.kafka.common.security.scram.ScramLoginModule
    at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:160)
    at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:146)
    at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:67)
    at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:99)
    at org.apache.kafka.clients.producer.KafkaProducer.newSender(KafkaProducer.java:441)
    at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:422)

我怀疑这是由于将 ClassLoader 设置为 null 造成的,但我不确定。

JAAS 字符串提到了这个 org.apache.kafka.common.security.scram.ScramLoginModule。我尝试不使用 JAAS,而是使用普通的用户名 + 密码,如下所示:

Properties props = new Properties();
props.put("sasl.username", username);
props.put("sasl.password", password);
// ...
Thread.currentThread().setContextClassLoader(null);
KafkaProducer<String, String> producer = new KafkaProducer<>(props);

但这也导致了异常,只是提到无法找到不同的类:

org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: unable to find LoginModule class: org.jboss.as.security.remoting.RemotingLoginModule
    at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:160)
    at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:146)
    at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:67)
    at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:99)
    at org.apache.kafka.clients.producer.KafkaProducer.newSender(KafkaProducer.java:441)
    at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:422)

我怎样才能找到org.apache.kafka.common.security.scram.ScramLoginModule?谢谢!

最佳答案

警告:丑陋的黑客!

在创建 KafkaProducer 之前,设置如下所示的上下文类加载器:

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

关于java - 卡夫卡Java客户端: ClassLoader doesn't find SASL/Scram Login Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57574901/

相关文章:

java - MemoryCacheImageOutputStream 到 BufferedImage

java - 使用两个嵌套的 for 循环和一个构造函数打印出重复模式

java.lang.IllegalArgumentException : Invalid lambda deserialization 异常

java - Kafka Consumer 卡在加入集群中

css - 使用 JBoss jDocBook maven 插件自定义 CSS

java - Android CMYK 模式

java - 从.csv文件中获取的字符编辑问题java

java - 收到Kafka消息后10分钟内安排 Activity

java - JBoss 5 的 HTTPS

java - Itextpdf停止正确转换pdf