我正在使用一个实现 BeanDefinitionRegistryPostProcessor 的类,以便我可以使用 postProcessBeanDefinitionRegistry 方法实例化 WebClient 类型 bean,将它们添加到注册表中,然后通过其他类中的 Autowired 和 Qualifier(nameBean) 使用它们。
一切正常,除了在普罗米修斯指标中我没有看到任何 jvm 或系统类型指标。
我有一个通过 re.test.pos.api.consumer.WebClientInstanceBuilderAutoConfiguration 从 META-INF/spring 调用的类。 该类调用 WebClientInstanceBuilder 类:
@Configuration
@EnableConfigurationProperties({ ConsumerProperties.class })
@ConditionalOnClass(WebClient.class)
@ConditionalOnBean(WebClient.Builder.class)
public class WebClientInstanceBuilderAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public WebClientInstanceBuilder webClientInstanceBuilder(Environment environment,
WebClient.Builder webClientBuilder) {
WebClientInstanceBuilder webClientInstanceBuilder = new WebClientInstanceBuilder(webClientBuilder);
return webClientInstanceBuilder;
}
}
我有一个WebClientInstanceBuilder类,它实现了BeanDefinitionRegistryPostProcessor,它的目标是在postProcessBeanDefinitionRegistry方法中实例化bean
public class WebClientInstanceBuilder implements BeanDefinitionRegistryPostProcessor {
ConsumerProperties consumerProperties;
WebClient.Builder webClientBuilder;
public WebClientInstanceBuilder(WebClient.Builder webClientBuilder) {
this.webClientBuilder = webClientBuilder;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
String beanKey = "accountManagementWebClient";
WebClient client = webClientBuilder.clone().baseUrl("https://test.api:8443/test")
.codecs( codecs -> {codecs.defaultCodecs();})
.build();
GenericBeanDefinition definition = new GenericBeanDefinition();
definition.setBeanClass(WebClient.class);
definition.setInstanceSupplier(() -> client);
registry.registerBeanDefinition(beanKey, definition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
我有一个使用 bean accountManagementWebClient 的类
@Component
public class AccountManager {
@Autowired
@Qualifier("accountManagementWebClient")
private WebClient accountWebClient;
public String getAccountByBillingAccountId(String billingAccountId, String tumUserId) {
WebClient theAccountWebClient = accountWebClient;
try {
return null;
} catch (Exception ex) {
throw ex;
}
}
}
除了普罗米修斯指标之外,一切都很好。 当我查看普罗米修斯指标时,我没有看到 JMV 指标。 我的 application.properties 我有:
management.server.port=4242
management.endpoints.web.exposure.include=*
management.metrics.enable.all=true
如果我删除 BeanDefinitionRegistryPostProcessor 的实现并继续使用另一个解决方案创建 WebClient Bean,我可以看到 Prometheus 的所有指标以及 jvm 和系统指标。 但在这种情况下,我在使用 @Autowired 检索 Bean 时遇到问题,因为不幸的是,一旦我删除 BeanDefinitionRegistryPostProcessor 的实现,Autowired 就会在实例化我的 bean 之前执行。
我尝试了很多事情但没有成功。
非常感谢
您不应该使用
BeanDefinitionRegistryPostProcessor
自定义 WebClient,而是可以这样做:
@Bean
WebClient accountWebClient(WebClient.Builder builder) {
return builder.baseUrl("https://httpbin.org/get").build();
}