Apache kafka Spring kafka不支持大型消息使用者
我正在使用spring Kafka来使用 鉴于此Kafka客户端始终将其构造函数中显示的Apache kafka Spring kafka不支持大型消息使用者,apache-kafka,spring-kafka,Apache Kafka,Spring Kafka,我正在使用spring Kafka来使用 鉴于此Kafka客户端始终将其构造函数中显示的AUTO\u OFFSET\u RESET\u CONFIG覆盖为none private LiKafkaConsumerImpl(LiKafkaConsumerConfig configs, Deserializer<K> keyDeserializer, Deserializer<V> valueDeserializer, Deserializer<L
AUTO\u OFFSET\u RESET\u CONFIG
覆盖为none
private LiKafkaConsumerImpl(LiKafkaConsumerConfig configs,
Deserializer<K> keyDeserializer,
Deserializer<V> valueDeserializer,
Deserializer<LargeMessageSegment> largeMessageSegmentDeserializer,
Auditor<K, V> consumerAuditor) {
_kafkaConsumer = new KafkaConsumer<>(configs.configForVanillaConsumer(),
byteArrayDeserializer,
byteArrayDeserializer);
}
Map<String, Object> configForVanillaConsumer() {
Map<String, Object> newConfigs = new HashMap<>();
newConfigs.putAll(this.originals());
newConfigs.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
newConfigs.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "none");
return newConfigs;
}
私有的LiKafkaConsumerImpl(LiKafkaConsumerConfig配置,
反序列化器键反序列化器,
反序列化程序值反序列化程序,
反序列化程序largeMessageSegmentDeserializer,
审计员(编辑){
_kafkaConsumer=新的kafkaConsumer(configs.configForVanillaConsumer(),
byteArrayDeserializer,
ByteArrayder(序列化程序);
}
映射configForVanillaConsumer(){
Map newConfigs=newhashmap();
newConfigs.putAll(this.originals());
newConfigs.put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,false);
newConfigs.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“无”);
返回新配置;
}
因此,一旦我开始使用批提交并将ENABLE\u AUTO\u commit\u CONFIG
设置为false,它就会抛出以下错误:
[org.springframework.kafka.KafkaListenerEndpointContainer#0-1-C-1]错误o.a.k.c.c.i.ConsumerCoordinator-用户为组文档事件使用者提供的侦听器com.linkedin.kafka.clients.consumer.likafkaConsumerBalanceListener在分区分配org.apache.kafka.clients.consumer.NoOffsetForPartitionException:未定义偏移量,分区没有重置策略:DocumentEvents-2
位于org.apache.kafka.clients.consumer.internal.Fetcher.resetOffset(Fetcher.java:369)
位于org.apache.kafka.clients.consumer.internal.Fetcher.updateFetchPositions(Fetcher.java:247)
位于org.apache.kafka.clients.consumer.KafkaConsumer.updateFetchPositions(KafkaConsumer.java:1602)
位于org.apache.kafka.clients.consumer.KafkaConsumer.position(KafkaConsumer.java:1265)
在com.linkedin.kafka.clients.consumer.likafcaumerrimpl.position(likafcaumerrimpl.java:403)
位于org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer$1.onPartitionsAssigned(KafkaMessageListenerContainer.java:447)
在com.linkedin.kafka.clients.consumer.likafkaConsumerBalanceListener.onPartitionsAssigned上(likafkaConsumerBalanceListener.java:62)
位于org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.onJoinComplete(ConsumerCoordinator.java:255)
位于org.apache.kafka.clients.consumer.internals.AbstractCoordinator.joinGroupIfNeeded(AbstractCoordinator.java:339)
位于org.apache.kafka.clients.consumer.internals.AbstractCoordinator.EnsuleReactiveGroup(AbstractCoordinator.java:303)
位于org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.poll(ConsumerCoordinator.java:286)
访问org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1030)
访问org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:995)
在com.linkedin.kafka.clients.consumer.likafcaumerrimpl.poll上(likafcaumerrimpl.java:231)
位于org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:558)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
运行(Thread.java:745)
发生此问题的原因是此使用者组是第一次使用此主题的邮件,因此它尝试使用偏移量重置策略
虽然我将其设置为“最早”,但它被底层LinkedIn kafka客户端覆盖为“无”
在本例中,我还试图覆盖ConsumerBalanceListener以手动搜索到开头,但实际上没有达到这一点
如何解决这个问题?有趣;请在中打开一个问题 如果策略为
none
,我们应该捕获该异常
同时,您可以通过使用普通客户端一次来解决此问题,从而为组实际设置初始偏移量(您实际上不必接收任何消息,只需分配分区并为组设置初始位置即可)。谢谢,我打开了一个我使用consumer position和seek方法来初始化consumer偏移量,这是它第一次使用主题分区。