在我的简单应用程序中,我试图实例化KafkaConsumer,我的代码几乎是code from javadoc(“自动偏移提交”)的副本:
@Slf4j
public class MyKafkaConsumer {
public MyKafkaConsumer() {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe( Arrays.asList("mytopic"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
log.info( record.offset() + record.key() + record.value() );
//System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
}
}
如果我尝试实例化这个,我得到:
org.apache.kafka.common.KafkaException: Failed to construct kafka consumer
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:781)
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:635)
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:617)
at ...MyKafkaConsumer.<init>(SikomKafkaConsumer.java:23)
...
Caused by: org.apache.kafka.common.KafkaException: org.apache.kafka.common.serialization.StringDeserializer is not an instance of org.apache.kafka.common.serialization.Deserializer
at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstance(AbstractConfig.java:248)
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:680)
... 48 more
如何解决这个问题?
答案 0 :(得分:1)
不确定这是否最终解决了您的错误,但是请注意,当在1.1.x kafka-clients jar中使用spring-kafka-test(版本2.1.5,从版本2.1.5开始)时,您将需要覆盖某些传递依赖项,如下所示:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>${spring.kafka.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<version>${spring.kafka.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.1.1</version>
<classifier>test</classifier>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>1.1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>1.1.1</version>
<classifier>test</classifier>
<scope>test</scope>
</dependency>
所以您的传递依赖肯定是个问题
答案 1 :(得分:1)
这可能是Kafka类加载的问题。
将classloader设置为null
可能会有所帮助。
...
Thread currentThread = Thread.currentThread();
ClassLoader savedClassLoader = currentThread.getContextClassLoader();
currentThread.setContextClassLoader(null);
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
currentThread.setContextClassLoader(savedClassLoader);
...
答案 2 :(得分:-1)
您的Custom类需要实现org.apache.kafka.common.serialization.Deserializer。
喜欢
import org.apache.kafka.common.header.Headers;
import org.apache.kafka.common.serialization.Serializer;
import org.apache.kafka.common.serialization.Deserializer;
import org.codehaus.jackson.map.ObjectMapper;
import java.io.Serializable;
import java.util.Map;
//Developed by Arun Singh
public class Employee implements Serializable, Serializer, **Deserializer** {
@Override
public Object deserialize(String s, byte[] bytes) {
ObjectMapper mapper = new ObjectMapper();
Employee employee = null;
try {
//employee = mapper.readValue(bytes, Employee.class);
employee = mapper.readValue(bytes.toString(), Employee.class);
} catch (Exception e) {
e.printStackTrace();
}
return employee;
}
@Override
public Object deserialize(String topic, Headers headers, byte[] data) {
ObjectMapper mapper = new ObjectMapper();
Employee employee = null;
try {
//employee = mapper.readValue(bytes, Employee.class);
employee = mapper.readValue(data.toString(), Employee.class);
} catch (Exception e) {
e.printStackTrace();
}
return employee;
}
public void close() {
}
}