`
15606915740
  • 浏览: 20086 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

springboot集成disconf

 
阅读更多
import com.baidu.disconf.client.DisconfMgrBean;
import com.baidu.disconf.client.DisconfMgrBeanSecond;
import com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import java.io.IOException;
import java.util.List;
import java.util.Properties;

配置类模板
public abstract class DisConfigTemplate {

    @Bean(destroyMethod = "destroy")
    public DisconfMgrBean getDisconfMgrBean(){
        DisconfMgrBean dmb = new DisconfMgrBean();
        dmb.setScanPackage(getScanPackage());
        return dmb;
    }

    public abstract String getScanPackage();

    @Bean(destroyMethod = "destroy",initMethod = "init")
    public DisconfMgrBeanSecond getDisconfMgrBean2(){
        return new DisconfMgrBeanSecond();
    }

    @Bean(name = "reloadablePropertiesFactoryBean")
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
    public ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean() {
        ReloadablePropertiesFactoryBean propertiesFactoryBean = new ReloadablePropertiesFactoryBean();
        propertiesFactoryBean.setSingleton(true);
        propertiesFactoryBean.setLocations(getFiles());
        return propertiesFactoryBean;
    }

    public abstract List<String> getFiles();

    @Bean(name = "propertyPlaceholderConfigurer")
    public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer(ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean){
        PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer();
        placeholderConfigurer.setIgnoreResourceNotFound(true);
        placeholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
        try {
            Properties properties = reloadablePropertiesFactoryBean.getObject();
            placeholderConfigurer.setProperties(properties);
        } catch (IOException e) {
            throw new RuntimeException("unable to find properties", e);
        }
        return placeholderConfigurer;
    }
}

配置类
@Configuration
public class DisconfConfig extends DisConfigTemplate{

     @Override
     public List<String> getFiles() {
        List<String> fileNames = Arrays.asList("classpath:edge-common.properties");
        return fileNames;
     }

     @Override
     public String getScanPackage() {
        return "com.clife.gatewaybg";
     }
}

获取spring的环境变量类
@Component
public class SpringContextUtil implements ApplicationContextAware{
    private static ApplicationContext applicationContext; // Spring应用上下文环境

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
    {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext()
    {
        return applicationContext;
    }

    @SuppressWarnings("unchecked")
    public static <T>  T getBean(String name) throws BeansException
    {
        return (T) applicationContext.getBean(name);
    }
}

重新加载变量到内存的类
@Component
@Scope("singleton")
@DisconfFile(filename = ScheDisconfUpdate.PROPERTIES_FILE)
@DisconfUpdateService(classes = { ScheDisconfUpdate.class })
public class ScheDisconfUpdate implements IDisconfUpdate
{
    protected final static String PROPERTIES_FILE = "common.properties";        // 配置文件名
    Logger logger = LoggerFactory.getLogger(ScheDisconfUpdate.class);

    @Autowired
    private SpringContextUtil springContextUtil;    // ApplicationContext


    @Override
    public void reload() throws Exception
    {
        String a = null;
        logger.info("重新加载disconf配置文件开始>>>>>>>>");
        Map disconfPropertiesRelMap = new HashMap();
        disconfPropertiesRelMap.put("test.test.test", "test");
        // continue add properties...

        resetPropertiesValues("com.controller.TestController", disconfPropertiesRelMap);
        logger.info("重新加载disconf配置文件结束>>>>>>>>");
    }


    @SuppressWarnings(
            { "unchecked", "rawtypes", "static-access" })
    private void resetPropertiesValues(String reflactSetPropClassName, Map disconfPropertiesRelMap)
    {
        if (!CollectionUtils.isEmpty(disconfPropertiesRelMap))
        {
            Set<Object> sets = disconfPropertiesRelMap.keySet();
            for(Object disconfkey : sets){
                Object propertiesKey = disconfPropertiesRelMap.get(disconfkey);
                if (!StringUtils.isEmpty((String)disconfkey))
                {
                    try
                    {
                        String afterChangedValue = getPropertiesValueByKay((String) disconfkey);
                        logger.info("disconf通过key:{}获取value:{}", disconfkey, afterChangedValue);
                        if (afterChangedValue != null)
                        {
                            Class involkPropertiesClass = Class.forName(reflactSetPropClassName);
                            String methodName = "set" + ((String) propertiesKey).substring(0, 1).toUpperCase() + ((String) propertiesKey).substring(1);
                            logger.info("disconf反射调用方法:{}", methodName);
                            Method method = involkPropertiesClass.getMethod(methodName, String.class);
                            method.invoke(springContextUtil.getApplicationContext().getBean(TestController.class), afterChangedValue);
                            logger.info("disconf修改重新修改属性:{}的值:{}", disconfkey, afterChangedValue);
                        }
                    }
                    catch (Exception e)
                    {
                        logger.error("disconf修改key值更新失败!e:{}", disconfkey, e.getMessage());
                    }
                }
            }
        }
    }


    private String getPropertiesValueByKay(String key)
    {
        try
        {
            Map map = FileTypeProcessorUtils.getKvMap(SupportFileTypeEnum.PROPERTIES, PROPERTIES_FILE);
            return map.get(key) == null ? null : map.get(key).toString();
        }
        catch (Exception e)
        {
            logger.error("disconf修改通过key:{}获取value失败!e:{}", key, e.getMessage());
            return null;
        }
    }
}


测试类
@RestController
public class TestController {

    @Value("${test.test.test}")
    private String test;
    @GetMapping(value = "/1/2")
    public String gettest(){
        return test+":woo";
    }

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }
}
分享到:
评论

相关推荐

    springboot集成百度disconf

    **SpringBoot集成Baidu Disconf详解** ...通过以上步骤,我们可以有效地将Disconf集成到SpringBoot项目中,实现配置的动态管理和高效运维。这种集成方式不仅简化了配置管理工作,也为系统的快速迭代提供了强大的支持。

    springboot集成datax的demo

    springboot集成datax的demo,下载及能运行

    SpringBoot集成TDengine程序Demo

    **SpringBoot集成TDengine程序Demo**是一篇关于如何在SpringBoot应用中整合TDengine数据库的实战教程。SpringBoot以其简洁的配置和快速的开发能力深受Java开发者喜爱,而TDengine则是一款高性能、分布式、适用于...

    springboot 集成kettle核心包依赖文件配置信息pom.xml

    springboot 集成kettle核心包依赖文件配置信息pom.xml

    springboot集成gbase8s小demo

    在本项目中,"springboot集成gbase8s小demo"是一个使用Spring Boot框架与GBase 8s数据库集成的示例应用。Spring Boot以其快速、开箱即用的特性,已经成为Java领域微服务开发的首选框架之一。GBase 8s是南大通用数据...

    【大数据入门笔记系列】第五节 SpringBoot集成hadoop开发环境(复杂版的WordCount)

    【大数据入门笔记系列】第五节 SpringBoot集成hadoop开发环境(复杂版的WordCount)前言环境清单创建SpringBoot项目创建包创建yml添加集群主机名映射hadoop配置文件环境变量HADOOP_HOME编写代码添加hadoop依赖jar包...

    SpringBoot集成PageOffice

    **SpringBoot集成PageOffice** SpringBoot是一款由Pivotal团队提供的快速开发框架,它简化了在Spring框架上创建生产级Java应用的过程。PageOffice则是一款能够实现网页在线编辑Word、Excel、PPT等Office文档的Java...

    springboot集成oauth2.0

    SpringBoot集成OAuth2.0是将流行的OAuth2.0安全框架与SpringBoot应用程序相结合的过程,以便为API和Web应用提供安全的访问控制。OAuth2.0是一个授权框架,允许第三方应用在用户授权的情况下访问其受保护的资源,而...

    基于springboot集成hbase过程解析

    "基于SpringBoot集成HBase过程解析" SpringBoot集成HBase是当前大数据处理和存储解决方案中的一种常见组合。HBase是基于Hadoop的分布式、可扩展的NoSQL数据库,能够存储大量的结构化和非结构化数据。SpringBoot则...

    最新版本springboot集成elasticsearch

    一般来说我们开发Elasticsearch会选择使用集成springboot,在网上找的springboot集成elasticsearch文章几乎都是extends ElasticsearchRepository的方式来实现。但是新版本ElasticsearchRepository里的方法基本上已经...

    springboot集成phoenix/presto/tidb/redis各模式等组件demo.zip

    此springboot--demo集成了以下组件,demo如无法运行、或缺失相应组件demo无法调用可以私聊52fighting https://blog.csdn.net/qq_25073261/article/details/105517616 1. netty-websocket 2. spring-boot-admin-...

    springboot集成UReport2源码

    springboot集成Ureport2 与业务结合//报表名称要以其ReportProvider中要求的前缀开始, 比如http://localhost:8080/ureport2-demo/ureport/preview?_u=file:test.ureport.xml等。

    基于Springboot集成yolo3构建基于神经网络的图片识别系统.zip

    基于Springboot集成yolo3构建基于神经网络的图片识别系统 基于Springboot集成yolo3构建基于神经网络的图片识别系统 基于Springboot集成yolo3构建基于神经网络的图片识别系统 基于Springboot集成yolo3构建基于神经...

    openoffice springboot集成 在线预览ppt,word,excel

    在IT行业中,集成OpenOffice与SpringBoot框架来实现在线预览PPT、Word和Excel是一项常见的需求,尤其在开发Web应用时。OpenOffice是一个开源的办公软件套件,它提供了API,可以用来处理多种文档格式,包括ODF...

    springboot集成impala(包含yml、impala配置类、pom.xml、impala jar)

    在本文中,我们将深入探讨如何在SpringBoot应用中集成Impala数据仓库系统,以及涉及到的相关配置和步骤。首先,我们来看看关键的组成部分: 1. **SpringBoot集成**: SpringBoot是基于Spring框架的一个轻量级开发...

    基于Springboot集成yolo3构建基于神经网络的图片识别系统源码.zip

    基于Springboot集成yolo3构建基于神经网络的图片识别系统源码.zip 基于Springboot集成yolo3构建基于神经网络的图片识别系统源码.zip 基于Springboot集成yolo3构建基于神经网络的图片识别系统源码.zip 基于Springboot...

    规则引擎Drools 之 springboot 集成、热加载

    前言: ...三、springboot集成drools  1.pom文件引入依赖 org.drools drools-core 7.0.0.Final org.drools drools-compiler 7.0.0.Final org.drools drools-decisiontabl

    springboot集成cloud

    springboot集成cmybaits-freemark项目基本结构demo,集成Eureka微服务的注册发现与消费服务demo,集成Ribbon负载均衡及应用demo,集成hystrix等断路由(雪崩效应)demo......

    SpringBoot 集成FluentMybatis 学习项目

    在本项目中,我们将深入探讨如何将流行的Java框架SpringBoot与高效的ORM库FluentMybatis集成,以便在实际开发中实现高效的数据操作。SpringBoot以其简洁的配置和强大的依赖管理能力,大大简化了Web应用的搭建过程。...

Global site tag (gtag.js) - Google Analytics