我們開發了使用 Spring Boot 應用程式實時重新加載配置屬性。我有一個 spring-kafka 消費者,我想利用實時重新加載,如果我更改消費者屬性,我應該能夠在不重新啟動應用程式的情況下啟動容器。我用了:
KafkaListenerEndpointRegistry.stop()
KafkaListenerEndpointRegistry.start()
我認為上面實際上創建了一個新容器,但事實并非如此。所以我想知道我是否必須用新的配置屬性啟動一個容器我該怎么做
@Bean
@ConfigurationProperties(prefix = "container.config.properties")
@ConditionalOnMissingBean
@RefreshScope
ContainerConfigProperties containerConfigProperties() {
return new ContainerConfigProperties();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(value = {ContainerConfigProperties.class})
@RefreshScope
<K, V> ConcurrentKafkaListenerContainerFactory<K, ValueDeserializerContainer<V>> kafkaListenerContainerFactory(final ConsumerFactory<K, ValueDeserializerContainer<V>> consumerFactory,
final ContainerConfigProperties containerConfigProperties,
final Optional<IAMIdentity> iamIdentity) {
val factory = new ConcurrentKafkaListenerContainerFactory<K, ValueDeserializerContainer<V>>();
factory.setBatchListener(true);
factory.setBatchErrorHandler(new SeekToCurrentBatchErrorHandler());
factory.setConsumerFactory(consumerFactory);
factory.getContainerProperties().setAckMode(containerConfigProperties.getAckMode());
factory.setConcurrency(containerConfigProperties.getConcurrency());
factory.getContainerProperties().setConsumerRebalanceListener(simpleConsumerRebalanceListener());
// update kafka consumer properties. Default is taken from the config file
iamIdentity.ifPresent(identity -> consumerFactory.updateConfigs(addIAMIdentity(identity)));
log.info("kafkaListenerContainerFactory");
return factory;
}
uj5u.com熱心網友回復:
您到底要更改哪些屬性?停止/啟動父容器時確實會重新創建子容器,因此ContainerProperties將獲取任何更改。
如果您在談論 kafka 消費者屬性,您要么需要重新配置消費者工廠,要么通過設定更改的屬性ContainerProperties.kafkaConsumerProperties以覆寫消費者工廠設定。
編輯
像這樣的東西可能會起作用:
@Bean
@RefreshScope
Object containerReconfigurer(KafkaListenerEndpointRegistry registry) {
registry.getListenerContainers().forEach(container -> {
container.stop();
// reconfigure container
container.start();
});
return null;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/466496.html
