我可以在运行时向我的@kafkalistener添加主题吗 [英] Can i add topics to my @kafkalistener at runtime
本文介绍了我可以在运行时向我的@kafkalistener添加主题吗的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
@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);
}
private String[] topics;
private final AtomicInteger count = new AtomicInteger();
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Foo foo() {
return new Foo();
}
@Bean
Supplier<String> idProvider() {
return () -> "so68744775-" + count.getAndIncrement();
}
@Bean
Supplier<String[]> topicProvider() {
return () -> this.topics;
}
@Bean
ApplicationRunner runner(ApplicationContext context) {
return args -> {
this.topics = new String[] { "topic1", "topic2" };
context.getBean(Foo.class);
this.topics = new String[] { "topic3" };
context.getBean(Foo.class);
};
}
}
class Foo {
@KafkaListener(id = "#{idProvider.get()}", topics = "#{topicProvider.get()}", groupId = "grp")
public void listen(String in) {
System.out.println(in);
}
}
但是,省略groupId
会更好,这样每个容器都在其自己的组中(id
属性)。这可避免在添加新容器时进行不必要的重新平衡。
这篇关于我可以在运行时向我的@kafkalistener添加主题吗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文