构建一个 SPI 将事件推送到 Kafka 中,以便在 Keycloak 6.0.1 中部署为 EAR>,它使用 WildFly 服务器,打包在基于 jboss/keycloak:6.0.1
的 Docker 镜像中。
我遇到了: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/