Java – the data source JMX MBean cannot be unregistered when the spring boot application is closed
•
Java
I have a simple spring boot application using org apache. commons. dbcp2. Basicdatasource as a datasource bean
The data source is automatically displayed as MBean through spring boot
Bean statement:
@Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setUrl(dbUrl); dataSource.setDriverClassName(jdbcDriver); dataSource.setUsername(dbUserName); dataSource.setPassword(dbPassword); return dataSource; }
Everything is fine However, I see an error when I close the application This error occurs only when the executable jar is running When using the gradle spring plug-in (gradle bootrun), it is not displayed
javax.management.InstanceNotFoundException: org.apache.commons.dbcp2:name=dataSource,type=BasicDataSource at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.exclusiveUnregisterMBean(DefaultMBeanServerInterceptor.java:427) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.unregisterMBean(DefaultMBeanServerInterceptor.java:415) at com.sun.jmx.mbeanserver.JmxMBeanServer.unregisterMBean(JmxMBeanServer.java:546) at org.apache.commons.dbcp2.BasicDataSource.close(BasicDataSource.java:1822) 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:483) at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:350) at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:273) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:540) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:516) at org.springframework.beans.factory.support.DefaultListablebeanfactory.destroySingleton(DefaultListablebeanfactory.java:827) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:485) at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:921) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:895) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.doClose(EmbeddedWebApplicationContext.java:152) at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:809)
I want to know, 1 How is this bean exposed as a JMX MBean? 2. How to log off the MBean correctly?
Solution
Spring tried to close the basicdatasource twice:
>Basicdatasource closes automatically when the application closes > spring uses the default destroy method to close the datasource, but it is already closed
To avoid this, use:
@Bean(destroyMethod = "") public DataSource dataSource()
In your Java configuration
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码