disconf
disconf copied to clipboard
更改druid配置信息回调异常
使用场景:因线上数据库链接不稳定,经常会变更数据库链接,想直接通过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
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()