Apache kafka 如何设置Kafka消费应用程序对批处理的依赖关系

Apache kafka 如何设置Kafka消费应用程序对批处理的依赖关系,apache-kafka,spring-kafka,Apache Kafka,Spring Kafka,我正在使用SpringKafka开发一个消费者应用程序。我计划使用pod保持24*7运行。但是,最近我知道有一些批处理过程会在这两者之间运行。而且,当这些批正在运行时,我们的处理不应该发生。因此,也许,不知何故,我必须停止对记录的轮询,当批处理完成后,我才能恢复处理。但是,我不知道如何做到这一点 无论批处理是否正在运行,我都可以通过查看一些标志来查询并从表中获取详细信息。但是,我怎样才能停止对记录的投票?如果我只让消费者应用程序运行而不处理任何东西,这不会导致重新平衡吗 配置类: @Bean 公

我正在使用SpringKafka开发一个消费者应用程序。我计划使用pod保持24*7运行。但是,最近我知道有一些批处理过程会在这两者之间运行。而且,当这些批正在运行时,我们的处理不应该发生。因此,也许,不知何故,我必须停止对记录的轮询,当批处理完成后,我才能恢复处理。但是,我不知道如何做到这一点

无论批处理是否正在运行,我都可以通过查看一些标志来查询并从表中获取详细信息。但是,我怎样才能停止对记录的投票?如果我只让消费者应用程序运行而不处理任何东西,这不会导致重新平衡吗

配置类:

@Bean
公共消费者工厂消费者工厂(){
Map props=newhashmap();
put(ConsumerConfig.BOOTSTRAP\u server\u CONFIG,KAFKA\u BROKERS);
props.put(ConsumerConfig.AUTO\u OFFSET\u RESET\u CONFIG,OFFSET\u RESET);
put(ConsumerConfig.KEY_反序列化程序_CLASS_CONFIG,StringDeserializer.CLASS.getName());
put(ConsumerConfig.VALUE_反序列化器_CLASS_CONFIG,KafkaAvroDeserializer.CLASS.getName());
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,GROUP\u ID\u CONFIG);
props.put(ConsumerConfig.MAX\u POLL\u RECORDS\u CONFIG,MAX\u POLL\u RECORDS);
props.put(ConsumerConfig.MAX\u POLL\u INTERVAL\u MS\u CONFIG,MAX\u POLL\u INTERVAL);
put(KafkaAvroDeserializerConfig.SCHEMA\u REGISTRY\u URL\u CONFIG,SCHEMA\u REGISTRY\u URL);
put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,“false”);
props.put(CommonClientConfigs.SECURITY\u PROTOCOL\u CONFIG、SSL\u PROTOCOL);
props.put(SslConfigs.SSL\u TRUSTSTORE\u LOCATION\u CONFIG,SSL\u TRUSTSTORE\u LOCATION\u FILE\u NAME);
props.put(SslConfigs.SSL\u TRUSTSTORE\u PASSWORD\u CONFIG,SSL\u TRUSTSTORE\u SECURE);
put(SslConfigs.SSL\u KEYSTORE\u LOCATION\u CONFIG,SSL\u KEYSTORE\u LOCATION\u FILE\u NAME);
put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG,SSL_KEYSTORE_SECURE);
props.put(SslConfigs.SSL\u KEY\u PASSWORD\u CONFIG,SSL\u KEY\u SECURE);
返回新的默认卡夫卡消费工厂(道具);
}
@豆子
ConcurrentKafkaListenerContainerFactory
kafkaListenerContainerFactory(){
ConcurrentKafkalistener集装箱工厂=
新的ConcurrentKafkaListenerContainerFactory();
setConsumerFactory(consumerFactory());
setConcurrency(KAFKA_CONCURRENCY);
factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);//手动异步通信
返回工厂;
}
代码:

@KafkaListener(topics=“${app.topic}”,groupId=“${app.group\u id\u config}”)
公共无效运行(ConsumerRecord记录、确认)引发异常{
试试{
int flag=getBatchIndquery();
//如何根据标志值-----停止和恢复?
//消费者恢复后的业务逻辑流程
processRecords();
InsertDb();
承认,承认;
}捕获(例外情况除外){
系统输出打印项次(记录);
System.out.println(例如getMessage());
}
}

使用端点注册表停止和启动容器

@KafkaListener(id=“myListener”…)
@Autowired
卡夫卡列斯特登记处;
...
registry.getListenerContainer(“myListener”).stop();

为@KafkaListener注释创建的侦听器容器不是应用程序上下文中的bean。相反,它们是在KafkaListenerEndpointRegistry类型的基础结构bean中注册的。这个bean由框架自动声明并管理容器的生命周期;它将自动启动任何AutoStart设置为true的容器。所有容器工厂创建的所有容器必须处于同一阶段。有关详细信息,请参阅侦听器容器自动启动。您可以使用注册表以编程方式管理生命周期。启动或停止注册表将启动或停止所有已注册的容器。或者,您可以通过使用单个容器的id属性来获取对该容器的引用。您可以在注释上设置AutoStart,这将覆盖容器工厂中配置的默认设置。您可以从应用程序上下文(例如自动连接)获取对bean的引用,以管理其注册的容器