disconf icon indicating copy to clipboard operation
disconf copied to clipboard

更改druid配置信息回调异常

Open fengt opened this issue 7 years ago • 1 comments

使用场景:因线上数据库链接不稳定,经常会变更数据库链接,想直接通过disconf变更配置(不重启应用服务),进而使应用自动reload数据配置并正常运行,技术框架:spring boot + mybatis + druid(xml配置) 。现问题如下:

采用无代码侵入配置:

<!-- 使用托管方式的disconf配置(无代码侵入, 配置更改会自动reload)-->
<bean id="configproperties_disconf"
      class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>classpath*:application.properties</value>
        </list>
    </property>
</bean>

当更改disconf配置中心的配置文件(application.properties)属性值(原值:spring.datasource.url=jdbc:mysql://localhost:3306/pick,新值:spring.datasource.url=jdbc:mysql://10.3.22.38:3306/pick)时,应用报错如下:

2018-01-10 21:12:33.212  INFO 37973 --- [ain-EventThread] c.b.d.client.watch.inner.NodeWatcher     : ============GOT UPDATE EVENT WatchedEvent state:SyncConnected type:NodeDataChanged path:/disconf/pick_1_0_0_0_rd/file/application.properties: (/disconf/pick_1_0_0_0_rd/file/application.properties,application.properties,配置文件)======================
2018-01-10-21:12:33 INFO  [com.baidu.disconf.client.watch.inner.NodeWatcher] - ============GOT UPDATE EVENT WatchedEvent state:SyncConnected type:NodeDataChanged path:/disconf/pick_1_0_0_0_rd/file/application.properties: (/disconf/pick_1_0_0_0_rd/file/application.properties,application.properties,配置文件)======================
2018-01-10 21:12:33.260  INFO 37973 --- [ain-EventThread] p.ReloadingPropertyPlaceholderConfigurer : Property changed detected: spring.datasource.url=jdbc:mysql://10.3.22.38:3306/pick
2018-01-10-21:12:33 INFO  [com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer] - Property changed detected: spring.datasource.url=jdbc:mysql://10.3.22.38:3306/pick
2018-01-10 21:12:33.261  INFO 37973 --- [ain-EventThread] p.ReloadingPropertyPlaceholderConfigurer : Updating property druidDataSource.url to jdbc:mysql://10.3.22.38:3306/pick
2018-01-10-21:12:33 INFO  [com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer] - Updating property druidDataSource.url to jdbc:mysql://10.3.22.38:3306/pick
2018-01-10 21:12:33.333 ERROR 37973 --- [ain-EventThread] p.ReloadingPropertyPlaceholderConfigurer : Error setting property druidDataSource.url to jdbc:mysql://10.3.22.38:3306/pick
org.springframework.beans.MethodInvocationException: Property 'url' threw exception; nested exception is java.lang.UnsupportedOperationException
	at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:486)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:292)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:260)
	at com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer.propertiesReloaded(ReloadingPropertyPlaceholderConfigurer.java:232)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesBase.notifyPropertiesChanged(ReloadablePropertiesBase.java:62)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesBase.setProperties(ReloadablePropertiesBase.java:76)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean.doReload(ReloadablePropertiesFactoryBean.java:228)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean.reload(ReloadablePropertiesFactoryBean.java:218)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean$ReloadablePropertiesImpl.reloadConfiguration(ReloadablePropertiesFactoryBean.java:251)
	at com.baidu.disconf.client.addons.properties.ReloadConfigurationMonitor.reload(ReloadConfigurationMonitor.java:33)
	at com.baidu.disconf.client.store.processor.impl.DisconfStoreFileProcessorImpl.inject2Store(DisconfStoreFileProcessorImpl.java:228)
	at com.baidu.disconf.client.core.processor.impl.DisconfFileCoreProcessorImpl.updateOneConfFile(DisconfFileCoreProcessorImpl.java:134)
	at com.baidu.disconf.client.core.processor.impl.DisconfFileCoreProcessorImpl.updateOneConf(DisconfFileCoreProcessorImpl.java:200)
	at com.baidu.disconf.client.core.processor.impl.DisconfFileCoreProcessorImpl.updateOneConfAndCallback(DisconfFileCoreProcessorImpl.java:162)
	at com.baidu.disconf.client.watch.inner.DisconfSysUpdateCallback.reload(DisconfSysUpdateCallback.java:24)
	at com.baidu.disconf.client.watch.inner.NodeWatcher.callback(NodeWatcher.java:145)
	at com.baidu.disconf.client.watch.inner.NodeWatcher.process(NodeWatcher.java:90)
	at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:526)
	at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:502)
Caused by: java.lang.UnsupportedOperationException: null
	at com.alibaba.druid.pool.DruidAbstractDataSource.setUrl(DruidAbstractDataSource.java:1103)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.beans.BeanWrapperImpl$BeanPropertyHandler.setValue(BeanWrapperImpl.java:358)
	at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:469)
	... 18 common frames omitted
2018-01-10-21:12:33 ERROR [com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer] - Error setting property druidDataSource.url to jdbc:mysql://10.3.22.38:3306/pick
org.springframework.beans.MethodInvocationException: Property 'url' threw exception; nested exception is java.lang.UnsupportedOperationException
	at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:486)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:292)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:260)
	at com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer.propertiesReloaded(ReloadingPropertyPlaceholderConfigurer.java:232)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesBase.notifyPropertiesChanged(ReloadablePropertiesBase.java:62)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesBase.setProperties(ReloadablePropertiesBase.java:76)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean.doReload(ReloadablePropertiesFactoryBean.java:228)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean.reload(ReloadablePropertiesFactoryBean.java:218)
	at com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean$ReloadablePropertiesImpl.reloadConfiguration(ReloadablePropertiesFactoryBean.java:251)
	at com.baidu.disconf.client.addons.properties.ReloadConfigurationMonitor.reload(ReloadConfigurationMonitor.java:33)
	at com.baidu.disconf.client.store.processor.impl.DisconfStoreFileProcessorImpl.inject2Store(DisconfStoreFileProcessorImpl.java:228)
	at com.baidu.disconf.client.core.processor.impl.DisconfFileCoreProcessorImpl.updateOneConfFile(DisconfFileCoreProcessorImpl.java:134)
	at com.baidu.disconf.client.core.processor.impl.DisconfFileCoreProcessorImpl.updateOneConf(DisconfFileCoreProcessorImpl.java:200)
	at com.baidu.disconf.client.core.processor.impl.DisconfFileCoreProcessorImpl.updateOneConfAndCallback(DisconfFileCoreProcessorImpl.java:162)
	at com.baidu.disconf.client.watch.inner.DisconfSysUpdateCallback.reload(DisconfSysUpdateCallback.java:24)
	at com.baidu.disconf.client.watch.inner.NodeWatcher.callback(NodeWatcher.java:145)
	at com.baidu.disconf.client.watch.inner.NodeWatcher.process(NodeWatcher.java:90)
	at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:526)
	at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:502)
Caused by: java.lang.UnsupportedOperationException: null
	at com.alibaba.druid.pool.DruidAbstractDataSource.setUrl(DruidAbstractDataSource.java:1103)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.beans.BeanWrapperImpl$BeanPropertyHandler.setValue(BeanWrapperImpl.java:358)
	at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:469)
	... 18 common frames omitted

fengt avatar Jan 10 '18 13:01 fengt

checked code at com.alibaba.druid.pool.DruidAbstractDataSource.setUrl(DruidAbstractDataSource.java:1103)

showed:

public void setUrl(String jdbcUrl) {
        if (inited) {
            throw new UnsupportedOperationException();
        }

        if (jdbcUrl != null) {
            jdbcUrl = jdbcUrl.trim();
        }

        this.jdbcUrl = jdbcUrl;

        // if (jdbcUrl.startsWith(ConfigFilter.URL_PREFIX)) {
        // this.filters.add(new ConfigFilter());
        // }
    }

if not in inited state, DruidAbstractDataSource unsupported to setUrl()

lintghi avatar Jan 17 '18 11:01 lintghi