gpt4 book ai didi

spring-boot - 我可以在运行时向我的@kafkalistener 添加主题吗

转载 作者:行者123 更新时间:2023-12-05 04:46:43 33 4
gpt4 key购买 nike

我为主题数组创建了一个 bean,在运行时我向这个主题数组添加了一些主题,但消费者没有更新主题并且仍然从主题数组中的第一个主题消费。我希望消费者添加这些新主题并开始消费

@Autowired
private String[] topicArray;

@KafkaListener(topics = "#{topicArray}", groupId = "MyGroup")
public void listen(...) {
...
}

最佳答案

没有;该属性在初始化期间被评估一次。

您不能在运行时将主题添加到现有的监听器容器。

但是,您可以让您的监听器 bean 成为原型(prototype) 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 属性)。这避免了在添加新容器时不必要的重新平衡。

关于spring-boot - 我可以在运行时向我的@kafkalistener 添加主题吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68744775/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com