[英]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.