对代码的学习,什么时候读取配合,入口在这 AbstractRefresher#refresh
比如你是Zookeeper配置
public class ZookeeperRefresher extends AbstractRefresher implements EnvironmentAware, InitializingBean{
public ZookeeperRefresher(DtpProperties dtpProperties) {
super(dtpProperties);
}
@Override
public void afterPropertiesSet() {
}
private void loadAndRefresh() {
refresh(CuratorUtil.genPropertiesMap(dtpProperties));
}
}
关注下 DtpZkAutoConfiguration
@Configuration
@ConditionalOnClass(value = org.apache.curator.framework.CuratorFramework.class)
@ConditionalOnBean({DtpBaseBeanConfiguration.class})
@AutoConfigureAfter({DtpBaseBeanConfiguration.class})
public class DtpZkAutoConfiguration {
@Bean
@ConditionalOnMissingBean()
public ZookeeperRefresher zookeeperRefresher(DtpProperties dtpProperties) {
return new ZookeeperRefresher(dtpProperties);
}
}
回到 AbstractRefresher
protected void doRefresh(DtpProperties properties) {
DtpRegistry.refresh(properties);
publishEvent(properties);
}
核心的刷新配置代码在这,就这段代码可以写得很简单,但写得这么复杂,作用是什么?
看 DtpRegistry 类
/**
* Refresh while the listening configuration changed.
*
* @param dtpProperties the main properties that maintain by config center
*/
public static void refresh(DtpProperties dtpProperties) {
if (Objects.isNull(dtpProperties) || CollectionUtils.isEmpty(dtpProperties.getExecutors())) {
log.debug("DynamicTp refresh, empty thread pool properties.");
return;
}
dtpProperties.getExecutors().forEach(DtpRegistry::refresh);
}
这里应该是一个装饰器模式
private static final Map<String, ExecutorWrapper> EXECUTOR_REGISTRY = new ConcurrentHashMap<>();
public static void refresh(DtpExecutorProps props) {
if (Objects.isNull(props) || StringUtils.isBlank(props.getThreadPoolName())) {
log.warn("DynamicTp refresh, thread pool name must not be blank, executorProps: {}", props);
return;
}
ExecutorWrapper executorWrapper = EXECUTOR_REGISTRY.get(props.getThreadPoolName());
if (Objects.nonNull(executorWrapper)) {
refresh(executorWrapper, props);
return;
}
log.warn("DynamicTp refresh, cannot find specified executor, name: {}.", props.getThreadPoolName());
}
EXECUTOR_REGISTRY中的数据哪来的?
OK 看到在 DtpRegistry中
public static void registerExecutor(ExecutorWrapper wrapper, String source) {
log.info("DynamicTp register executor: {}, source: {}", ExecutorConverter.toMainFields(wrapper), source);
EXECUTOR_REGISTRY.putIfAbsent(wrapper.getThreadPoolName(), wrapper);
}
在 DtpPostProcessor 中,对 声明的ThreadPoolExecutor进行了注册
public class DtpPostProcessor implements BeanPostProcessor, BeanFactoryAware, PriorityOrdered {
@Override
public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
if (!(bean instanceof ThreadPoolExecutor) && !(bean instanceof ThreadPoolTaskExecutor)) {
return bean;
}
if (bean instanceof DtpExecutor) {
return registerAndReturnDtp(bean);
}
// register juc ThreadPoolExecutor or ThreadPoolTaskExecutor
return registerAndReturnCommon(bean, beanName);
}
在 registerAndReturnCommon 中对注解 DynamicTp 进行了处理
private DefaultListableBeanFactory beanFactory;@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = (DefaultListableBeanFactory) beanFactory;
}
private Object registerAndReturnCommon(Object bean, String beanName) {
String dtpAnnoValue;
try {
DynamicTp dynamicTp = beanFactory.findAnnotationOnBean(beanName, DynamicTp.class);
if (Objects.nonNull(dynamicTp)) {
dtpAnnoValue = dynamicTp.value();
} else {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
if (!(beanDefinition instanceof AnnotatedBeanDefinition)) {
return bean;
}
AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) beanDefinition;
MethodMetadata methodMetadata = (MethodMetadata) annotatedBeanDefinition.getSource();
if (Objects.isNull(methodMetadata) || !methodMetadata.isAnnotated(DynamicTp.class.getName())) {
return bean;
}
dtpAnnoValue = Optional.ofNullable(methodMetadata.getAnnotationAttributes(DynamicTp.class.getName()))
.orElse(Collections.emptyMap())
.getOrDefault("value", "")
.toString();
}
} catch (NoSuchBeanDefinitionException e) {
log.warn("There is no bean with the given name {}", beanName, e);
return bean;
}
String poolName = StringUtils.isNotBlank(dtpAnnoValue) ? dtpAnnoValue : beanName;
return doRegisterAndReturnCommon(bean, poolName);
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。