簡體   English   中英

我可以在運行時向我的@kafkalistener 添加主題嗎

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM