Java 使用@KafkaListener消费消息时,消费者中丢失了多条消息

Java 使用@KafkaListener消费消息时,消费者中丢失了多条消息,java,apache-kafka,spring-kafka,Java,Apache Kafka,Spring Kafka,我有10个主题,每5分钟向代理发送1000条消息,我在发送消息时丢失了从生产者使用线程发送的几条消息,而消费者使用@kafkalistener发送的消息。 我如何处理这个问题?是否对错误的生产者或消费者进行了任何设置?我使用2个代理和消费者组 我认为@KafkaListener无法仔细聆听,示例10消息指向1个主题,而听者只收到3条消息,7条消息丢失 这是我的制片人 public Map<String, Object> producerConfigs() { Map<S

我有10个主题,每5分钟向代理发送1000条消息,我在发送消息时丢失了从生产者使用线程发送的几条消息,而消费者使用@kafkalistener发送的消息。 我如何处理这个问题?是否对错误的生产者或消费者进行了任何设置?我使用2个代理和消费者组

我认为@KafkaListener无法仔细聆听,示例10消息指向1个主题,而听者只收到3条消息,7条消息丢失

这是我的制片人

public Map<String, Object> producerConfigs() {
    Map<String, Object> props = new HashMap<>();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9095,localhost:9094");
    props.put(ProducerConfig.ACKS_CONFIG, "all");
    props.put(ProducerConfig.RETRIES_CONFIG, retries);
    props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);
    props.put(ProducerConfig.LINGER_MS_CONFIG, linger);
    props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory);
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
    props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 1);
    return props;
}

public ProducerFactory<String, String> producerFactory() {
    return new DefaultKafkaProducerFactory<>(producerConfigs());
}

@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
    return new KafkaTemplate<String, String>(producerFactory());
}
公共地图产品配置(){
Map props=newhashmap();
put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9095,localhost:9094”);
props.put(ProducerConfig.ACKS_CONFIG,“all”);
props.put(ProducerConfig.RETRIES\u配置,RETRIES);
props.put(ProducerConfig.BATCH\u SIZE\u CONFIG,batchSize);
props.put(ProducerConfig.LINGER\u MS\u CONFIG,LINGER);
props.put(ProducerConfig.BUFFER\u MEMORY\u CONFIG,bufferMemory);
put(ProducerConfig.KEY\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS);
put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,JsonSerializer.CLASS);
props.put(ProducerConfig.MAX\u在飞行中请求每个连接,1);
返回道具;
}
公共生产工厂生产工厂(){
返回新的DefaultKafkaProducerFactory(producerConfigs());
}
@豆子
公共卡夫卡模板卡夫卡模板(){
返回新的卡夫卡模板(producerFactory());
}
这是我的消费者

@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.setConcurrency(concurrency);
    factory.getContainerProperties().setPollTimeout(1500);
    factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE);
    return factory;
}

public ConsumerFactory<String, String> consumerFactory() {
    return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}

public Map<String, Object> consumerConfigs() {
    Map<String, Object> propsMap = new HashMap<>();
    propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9095,localhost:9094");
    propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval);
    propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout);
    propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
    propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id");
    propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset);
    return propsMap;
}
@Bean
公共KafkaListenerContainerFactory KafkaListenerContainerFactory(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(consumerFactory());
工厂设置并发(concurrency);
getContainerProperties().setPollTimeout(1500);
factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE);
返回工厂;
}
公共消费者工厂消费者工厂(){
返回新的DefaultKafkanConsumerFactory(consumerConfigs());
}
公共地图使用者配置(){
Map propsMap=newhashmap();
propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9095,localhost:9094”);
propsMap.put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,false);
propsMap.put(ConsumerConfig.AUTO\u COMMIT\u INTERVAL\u MS\u CONFIG,autoCommitInterval);
propsMap.put(ConsumerConfig.SESSION\u TIMEOUT\u MS\u CONFIG,sessionTimeout);
propsMap.put(ConsumerConfig.KEY\u反序列化程序\u类\u配置,StringDeserializer.CLASS);
propsMap.put(ConsumerConfig.VALUE\u反序列化程序\u类\u配置,JsonDeserializer.CLASS);
propsMap.put(ConsumerConfig.GROUP_ID_CONFIG,“GROUP_ID”);
propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,autoOffsetReset);
返回属性映射;
}

请您添加一些源代码,说明如何生成消息(包括制作者的配置)以及如何使用这些消息。否则,我们只能猜测。请检查我的更新您是否为每批要发送的消息刷新制作人?如果控制台使用者也丢失了消息,那么监听器不是问题所在,生产者是,im刷新每条消息,如果消息发送到代理时失败,则调用函数回调。我认为这不是生产者的问题,而是消费者的问题。根据我上面的解释,如果我向一个主题发送10条消息,消费者只会阅读3条消息,丢失7条消息