disconf 实践(二)【原创】

因为有些系统的配置文件会随着业务更改,如某些控制开关,当大批量集群时,按照 上一篇文章的配置就不够啦,需要做到热加载。
研究了一下,还好,比较简单,只要替换 上一篇文章第4步的配置文件( spring-disconf.xml)即可。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd">
    
    <!-- 使用disconf必须添加以下配置 -->
	<bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean"
	      destroy-method="destroy">
	    <property name="scanPackage" value="com.baidu"/>
	</bean>
	<bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"
	      init-method="init" destroy-method="destroy">
	</bean>
    
    <!-- 使用托管方式的disconf配置(无代码侵入, 配置更改自动reload)-->
	<bean id="configproperties_disconf"
      class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
	    <property name="locations">
	        <list>
	            <value>config.properties</value>
	        </list>
	    </property>
	</bean>
	
	<bean id="propertyConfigurer"
      class="com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer">
	    <property name="ignoreResourceNotFound" value="true" />
	    <property name="ignoreUnresolvablePlaceholders" value="true" />
	    <property name="propertiesArray">
	        <list>
	            <ref bean="configproperties_disconf"/>
	        </list>
	    </property>
	</bean>
	
	<!-- 使用托管方式的disconf配置(无代码侵入, 配置更改不会自动reload)-->
	<bean id="configproperties_no_reloadable_disconf"
	      class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
	    <property name="locations">
	        <list>
	            <value>redis.properties</value>
	            <value>jdbc.properties</value>
	        </list>
	    </property>
	</bean>
	
	<bean id="propertyConfigurerForProject1"
	      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="ignoreResourceNotFound" value="true"/>
	    <property name="ignoreUnresolvablePlaceholders" value="true"/>
	    <property name="propertiesArray">
	        <list>
	            <ref bean="configproperties_no_reloadable_disconf"/>
	        </list>
	    </property>
	</bean>
</beans>


其中 config.properties 实现了热加载, jdbc.properties和redis.properties只实现同步,需要重启加载。

当我们在disconf管理端,任意修改一个config.properties的属性,就会在控制台打印出相应信息,如:

INFO [main-EventThread] ReloadingPropertyPlaceholderConfigurer.propertiesReloaded(155) | Property changed detected: gtw.route.socket.timeout=8000
INFO [main-EventThread] ReloadingPropertyPlaceholderConfigurer.propertiesReloaded(227) | Updating property routeService.socketTimeout to 8000

猜你喜欢

转载自zhenggm.iteye.com/blog/2333266