在 Spring Boot 中覆盖 AnnotationMBeanExporter 上的默认 RegistrationPolicy

n99*_*n99 4 java spring jmx spring-boot

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfiguration.java

显示

RegistrationPolicy.FAIL_ON_EXISTING 
Run Code Online (Sandbox Code Playgroud)

正在设置。

我们在独立的 tcserver 中使用 spring boot 创建的 WAR。新部署发生在旧版本取消部署之前,因此您可以部署多个版本。

我已经在使用

spring.jmx.default-domain=[app name]
Run Code Online (Sandbox Code Playgroud)

避免跨应用程序发生冲突……但是

我们看到类似的错误

UnableToRegisterMBeanException: Unable to register MBean with  key 'dataSourceMBean'
  nested exception is javax.management.InstanceAlreadyExistsException
Run Code Online (Sandbox Code Playgroud)

我们的数据源 Mbean 跨同一应用程序的不同版本。

我想设置一个

RegistrationPolicy.IGNORE_EXISTING
Run Code Online (Sandbox Code Playgroud)

根据http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jmx.html#jmx-exporting-registration-behavior

我可以在维护 ObjectNamingStrategy 和 defaultDomain 的同时轻松做到这一点吗?虽然一点都不困难,但我希望我不必几乎覆盖所有 JmxAutoConfiguration?

可惜没有

spring.jmx.mbeanExporter.registrationPolicy
Run Code Online (Sandbox Code Playgroud)

弹簧靴属性

干杯

小智 7

虽然这个问题是前一段时间被问到的,也许你已经找到了答案,但一旦我遇到这个问题并找到一个对我有用的解决方案,我就会在这里给我 2 美分。

最初我并不完全清楚我需要做什么,但是当仔细阅读您在问题中提供的相同 spring 文档时,我发现您可以通过引入类注释来控制 SpringBoot 上的注册行为

@EnableMBeanExport(registration=RegistrationPolicy.IGNORE_EXISTING)

如果 MBean 已经注册,则允许 Spring 忽略第二个 JMX 注册,如此处的 spring 文档所示