Spring boot Springboot KafkaListener正在收听多个主题
我正在尝试构建一个卡夫卡服务,其中有两个主题和一个消费者。每个主题都有10个分区。目前,我有一个设置,消费者可以同时收听这两个主题 我想使处理优先级为基础。我想对主题1中的事件给予比主题2更高的优先级 因此,目标是,仅当主题1中没有事件时,才处理主题2中的事件。我一直在尝试消费者。暂停选项,但迄今为止没有运气,因为我是卡夫卡的初学者 请欣赏一段代码片段,它可以显示实现此目标所需的功能。以下是一个解决方案:Spring boot Springboot KafkaListener正在收听多个主题,spring-boot,apache-kafka,kafka-consumer-api,spring-kafka,Spring Boot,Apache Kafka,Kafka Consumer Api,Spring Kafka,我正在尝试构建一个卡夫卡服务,其中有两个主题和一个消费者。每个主题都有10个分区。目前,我有一个设置,消费者可以同时收听这两个主题 我想使处理优先级为基础。我想对主题1中的事件给予比主题2更高的优先级 因此,目标是,仅当主题1中没有事件时,才处理主题2中的事件。我一直在尝试消费者。暂停选项,但迄今为止没有运气,因为我是卡夫卡的初学者 请欣赏一段代码片段,它可以显示实现此目标所需的功能。以下是一个解决方案: @springboot应用程序 公共类SO63855196应用程序{ 公共静态void m
@springboot应用程序
公共类SO63855196应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So63855196Application.class,args);
}
@豆子
公共新闻{
返回TopicBuilder.name(“hiT”).partitions(1.replications(1.build());
}
@豆子
公共地段(){
返回TopicBuilder.name(“loT”).partitions(1).replications(1.build();
}
@豆子
公共应用程序运行程序(KafkaTemplate模板){
返回参数->{
IntStream.range(0,10).forEach(i->template.send(“loT”,“foo”+i));
睡眠(3000);
IntStream.range(0,2).forEach(i->template.send(“hiT”,“bar”+i));
};
}
}
@组成部分
类侦听器{
私有静态最终记录器log=LoggerFactory.getLogger(Listener.class);
私人最终卡夫卡利登记处;
private final AtomicBoolean暂停=新建AtomicBoolean();
监听器(KafkaListenerEndpointRegistry){
this.registry=注册表;
}
@卡夫卡列斯汀(id=“high”,topics=“hiT”)
@卡夫卡列斯汀(id=“low”,topics=“loT”,
properties=ConsumerConfig.MAX\u POLL\u RECORDS\u CONFIG+“:1”)
public void listen(字符串输入,@Header(KafkaHeaders.RECEIVED_TOPIC)字符串主题)抛出InterruptedException{
System.out.println(in+“from”+主题);
if(主题等于(“命中”)){
if(this.paused.compareAndSet(false,true)){
日志信息(“高优先级活动;暂停低优先级”);
this.registry.getListenerContainer(“低”).pause();
}
}
《睡眠》(2000年);
}
@事件监听器
公共作废事件(ListenerContainerIdleEvent事件){
if(event.getListenerId().startsWith(“高”)){
if(this.paused.compareAndSet(true,false)){
日志信息(“高优先级空闲;恢复低优先级”);
this.registry.getListenerContainer(“低”).resume();
}
}
}
}
及
这仅在容器具有并发性=1
时有效;当容器有多个线程时,它需要更复杂一些
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.listener.idle-event-interval=1000
foo0 from loT
foo1 from loT
bar0 from hiT
2020-09-14 09:40:28.630 INFO 39300 --- [ high-0-C-1] com.example.demo.Listener : Hi-pri active; pausing low-pri
bar1 from hiT
2020-09-14 09:40:37.647 INFO 39300 --- [ high-0-C-1] com.example.demo.Listener : Hi-pri idle; resuming low-pri
foo2 from loT
foo3 from loT
foo4 from loT
foo5 from loT
foo6 from loT
foo7 from loT
foo8 from loT
foo9 from loT