![](/img/trans.png)
[英]How can I effectively bind my @KafkaListener to ConcurrentKafkaListenerContainerFactory?
[英]Can i add topics to my @kafkalistener at runtime
我为主题数组创建了一个 bean,在运行时我向这个主题数组添加了一些主题,但是消费者没有更新主题,并且仍然从主题数组中的第一个主题中消费。 我希望消费者添加这些新主题并开始从中消费
@Autowired
private String[] topicArray;
@KafkaListener(topics = "#{topicArray}", groupId = "MyGroup")
public void listen(...) {
...
}
不; 该属性在初始化期间被评估一次。
您不能在运行时将主题添加到现有的侦听器容器。
但是,您可以使您的侦听器 bean 成为原型 bean,并在每次您想收听新主题时创建一个新容器。
这是一个例子:
@SpringBootApplication
public class So68744775Application {
public static void main(String[] args) {
SpringApplication.run(So68744775Application.class, args);
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Foo foo(String id, String[] topics) {
return new Foo(id, topics);
}
@Bean
public ApplicationRunner runner(ApplicationContext context) {
return args -> {
context.getBean(Foo.class, "one", new String[] { "topic1", "topic2" });
context.getBean(Foo.class, "two", new String[] { "topic3" });
};
}
}
class Foo {
private final String id;
private final String[] topics;
public Foo(String id, String[] topics) {
this.id = id;
this.topics = topics;
}
public String getId() {
return this.id;
}
public String[] getTopics() {
return this.topics;
}
@KafkaListener(id = "#{__listener.id}", topics = "#{__listener.topics}")
public void listen(String in) {
System.out.println(in);
}
}
但是请注意,最好省略groupId
,这样每个容器都在自己的组中( id
属性)。 这避免了在添加新容器时不必要的重新平衡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.