首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dynamictp学习

dynamictp学习

原创
作者头像
顾老师的猫
修改2024-10-25 11:43:09
修改2024-10-25 11:43:09
11200
代码可运行
举报
运行总次数:0
代码可运行

对代码的学习,什么时候读取配合,入口在这 AbstractRefresher#refresh

比如你是Zookeeper配置

代码语言:java
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
@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

代码语言:java
复制
    protected void doRefresh(DtpProperties properties) {
        DtpRegistry.refresh(properties);
        publishEvent(properties);
    }

核心的刷新配置代码在这,就这段代码可以写得很简单,但写得这么复杂,作用是什么?

看 DtpRegistry 类

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 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);
}

这里应该是一个装饰器模式

代码语言:javascript
代码运行次数:0
运行
复制
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中

代码语言:javascript
代码运行次数:0
运行
复制
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进行了注册

代码语言:javascript
代码运行次数:0
运行
复制
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 进行了处理

代码语言:javascript
代码运行次数:0
运行
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档