SpringBoot: настройка источника данных "jmx-enabled" не регистрирует источник данных
Я пытаюсь добавить свой источник данных в JMX, установив для свойства "jmx-enabled" значение true. У меня есть два источника данных, поэтому свойства конфигурации немного отличаются:
datasource:
main:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://chico-testdb1.build.internal\CHICOTEST;selectMethod=cursor;applicationName=omc;sendStringParametersAsUnicode=false
username: *
password: *
max-active: 150
jmx-enabled: true
Я посмотрел на класс DataSourceAutoConfiguration, и кажется, что он создает MBean, только когда конфигурация использует префикс "spring.datasource". Итак, я смоделировал свою собственную конфигурацию после этого примера:
@Bean
@ConditionalOnProperty(prefix = "datasource.main", name = "jmx-enabled", havingValue="true")
public Object dataSourceMBean(@Qualifier("mainDataSource") DataSource dataSource) {
if (dataSource instanceof DataSourceProxy) {
try {
return ((DataSourceProxy) dataSource).createPool().getJmxPool();
}
catch (SQLException ex) {
logger.warn("Cannot expose DataSource to JMX (could not connect)");
}
}
return null;
}
Условие работает отлично, и этот метод возвращает пул соединений Jmx. Тем не менее, этот bean-компонент все еще не регистрируется в MBeanServer, и я не вижу исключений в журналах.
Я смог обойти это, явно зарегистрировав компонент на сервере, но я чувствую, что должен быть лучший способ?
@Bean
@ConditionalOnProperty(prefix = "datasource.main", name = "jmx-enabled", havingValue="true")
public ConnectionPool getJmxPool(@Qualifier("mainDataSource") DataSource dataSource, MBeanServer mBeanServer) throws SQLException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException {
if (dataSource instanceof DataSourceProxy) {
ConnectionPool pool = ((DataSourceProxy)dataSource).createPool().getJmxPool();
mBeanServer.registerMBean(pool, new ObjectName("com.build.jdbc:type="+ dataSource.getClass().getName()+",name=main"));
return pool;
}
return null;
}
1 ответ
Использование внутреннего статического класса и явная зависимость от mbeanExporter решает проблему при использовании spring-boot 1.3.2.RELEASE
@Configuration
@ConditionalOnProperty(prefix = "datasource.main", name = "jmx-enabled")
@ConditionalOnClass(DataSourceProxy.class)
@ConditionalOnMissingBean(name = "mainDataSourceMBean")
protected static class TomcatDataSourceJmxConfiguration {
@Bean
@DependsOn("mbeanExporter")
public Object mainDataSourceMBean(@Qualifier("mainDataSource") DataSource dataSource") DataSource dataSource) {
if (dataSource instanceof DataSourceProxy) {
try {
return ((DataSourceProxy) dataSource).createPool().getJmxPool();
} catch (SQLException ex) {
logger.warn("Cannot expose DataSource to JMX (could not connect)");
}
}
return null;
}
}