Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Springboot KafkaListener正在收听多个主题_Spring Boot_Apache Kafka_Kafka Consumer Api_Spring Kafka - Fatal编程技术网

Spring boot Springboot KafkaListener正在收听多个主题

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

我正在尝试构建一个卡夫卡服务,其中有两个主题和一个消费者。每个主题都有10个分区。目前,我有一个设置,消费者可以同时收听这两个主题

我想使处理优先级为基础。我想对主题1中的事件给予比主题2更高的优先级

因此,目标是,仅当主题1中没有事件时,才处理主题2中的事件。我一直在尝试消费者。暂停选项,但迄今为止没有运气,因为我是卡夫卡的初学者

请欣赏一段代码片段,它可以显示实现此目标所需的功能。

以下是一个解决方案:

@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