gpt4 book ai didi

java - 如何以编程方式自动配置?

转载 作者:IT老高 更新时间:2023-10-28 13:50:03 28 4
gpt4 key购买 nike

我有一个 spring boot kafka 应用程序。我的经纪人每隔几天就会被回收一次。旧代理被取消配置,新代理被配置。

我有一个调度程序,它每隔几个小时检查一次代理。我想确保一旦我们有了新的经纪人,我们应该重新加载所有与 Spring Kafka 相关的 bean。与 KafkaAutoConfiguration 非常相似,只是我希望触发代理值更改并以编程方式加载自动配置。

每当旧代理被新代理替换时,如何以编程方式调用自动配置?

最佳答案

您的要求听起来像 Spring Cloud 中的 Config Server:https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/multi/multi__spring_cloud_config_2.html#_spring_cloud_config_2及其 @RefreshScope 功能:https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/multi/multi__spring_cloud_context_application_context_services.html#refresh-scope .

因此,您需要指定自己的 bean 并用该注释标记它们:

@Bean
@RefreshScope
public ConsumerFactory<?, ?> kafkaConsumerFactory() {
return new DefaultKafkaConsumerFactory<>(this.properties.buildConsumerProperties());
}

@Bean
@RefreshScope
public ProducerFactory<?, ?> kafkaProducerFactory() {
DefaultKafkaProducerFactory<?, ?> factory = new DefaultKafkaProducerFactory<>(
this.properties.buildProducerProperties());
String transactionIdPrefix = this.properties.getProducer().getTransactionIdPrefix();
if (transactionIdPrefix != null) {
factory.setTransactionIdPrefix(transactionIdPrefix);
}
return factory;
}

这两个 bean 依赖于连接到 Apache Kafka 代理的配置属性,这足以让它们刷新。每当 ContextRefreshedEvent 发生时,这些 bean 将使用新的配置属性重新初始化。

我认为 ConsumerFactory 消费者(MessageListenerContainerKafkaListenerEndpointRegistry)也必须在该事件上重新启动。关键是 MessageListenerContainer 启动了一个长期存在的进程,因此为 poll 目的缓存了一个 KafkaConsumer 实例。

所有 ProducerFactory 消费者不需要重新启动。即使 KafkaProducer 缓存在 DefaultKafkaProducerFactory 中,它也会在 @RefreshScope 阶段重新初始化。

更新

I don’t use config server. I get the new hosts from consul catalog service.

对,我没有说你使用配置服务器。那只是以类似的方式寻找我。因此,从高处看,我真的会研究一下您的 Consul 目录解决方案的 Config Client 实现。

尽管如此,您仍然可以发出一个 RefreshEvent,它会触发您的所有 @RefreshScope bean 被重新加载。为此,您需要实现一个 ApplicationEventPublisherAware 并在您从 Consul 获得更新时发出该事件。请记住:Kafka 监听器容器必须重新启动。为此,您可以监听 RefreshScopeRefreshedEvent,因为只有当所有 @RefreshScope 都已刷新时,您才真正对重新启动感兴趣。

更多关于刷新范围:https://gist.github.com/dsyer/a43fe5f74427b371519af68c5c4904c7

关于java - 如何以编程方式自动配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902902/

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