Kafka + Spring Batch Listener Flush Batch

时间:2018-05-16 12:22:52

标签: apache-kafka kafka-consumer-api spring-kafka

使用Kafka Broker:1.0.1 spring-kafka:2.1.6.RELEASE

我正在使用具有以下设置的批量消费者:

// Other settings are not shown..
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "100");

我以下列方式使用spring listener:

 @KafkaListener(topics = "${topics}", groupId = "${consumer.group.id}")
    public void receive(final List<String> data,
                        @Header(KafkaHeaders.RECEIVED_PARTITION_ID) final List<Integer> partitions,
                        @Header(KafkaHeaders.RECEIVED_TOPIC) Set<String> topics,
                        @Header(KafkaHeaders.OFFSET) final List<Long> offsets) { // ......code... }

我总是发现一些消息仍然在批处理中,而不是在我的监听器中收到。似乎如果剩余的消息小于批量大小,则不会消耗它(可能在内存中并发布给我的监听器)。有没有办法让一个设置在一段时间间隔后自动刷新批处理,以避免消息没有被刷新? 与批量消费者一起处理此类情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我刚刚进行了测试而没有任何问题...

@SpringBootApplication
public class So50370851Application {

    public static void main(String[] args) {
        SpringApplication.run(So50370851Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template) {
        return args -> {
            for (int i = 0; i < 230; i++) {
                template.send("so50370851", "foo" + i);
            }
        };
    }

    @KafkaListener(id = "foo", topics = "so50370851")
    public void listen(List<String> in) {
        System.out.println(in.size());
    }

    @Bean
    public NewTopic topic() {
        return new NewTopic("so50370851", 1, (short) 1);
    }

}

spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.max-poll-records=100
spring.kafka.listener.type=batch

100
100
30
  

此外,调试日志显示一段时间后它正在轮询并获取0条记录(这会反复重复)。

这意味着问题出在发送方。