Browse Source

Prevent duplicate JmxEndpoint MBean registration

Update JmxEndpoint support so that the `@ManagedResource` annotation
is no longer required. This prevents both `EndpointMBeanExporter` and
the regular `AnnotationMBeanExporter` from both registering the bean.

Fixes gh-7813
See gh-6579
pull/7807/merge
Phillip Webb 9 years ago
parent
commit
8a9a61b64f
  1. 2
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/AbstractJmxEndpoint.java
  2. 6
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/AuditEventsJmxEndpoint.java
  3. 2
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/DataEndpointMBean.java
  4. 2
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBean.java
  5. 24
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporter.java
  6. 6
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/JmxEndpoint.java
  7. 2
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/LoggersEndpointMBean.java
  8. 2
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/ShutdownEndpointMBean.java

2
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/AbstractJmxEndpoint.java

@ -22,7 +22,6 @@ import org.springframework.boot.actuate.endpoint.Endpoint; @@ -22,7 +22,6 @@ import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.EndpointProperties;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.util.ObjectUtils;
/**
@ -33,7 +32,6 @@ import org.springframework.util.ObjectUtils; @@ -33,7 +32,6 @@ import org.springframework.util.ObjectUtils;
* @author Phillip Webb
* @since 1.5.0
*/
@ManagedResource
public abstract class AbstractJmxEndpoint implements JmxEndpoint, EnvironmentAware {
private final DataConverter dataConverter;

6
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/AuditEventsJmxEndpoint.java

@ -28,6 +28,7 @@ import org.springframework.boot.actuate.audit.AuditEventRepository; @@ -28,6 +28,7 @@ import org.springframework.boot.actuate.audit.AuditEventRepository;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* {@link JmxEndpoint} for {@link AuditEventRepository}.
@ -72,7 +73,10 @@ public class AuditEventsJmxEndpoint extends AbstractJmxEndpoint { @@ -72,7 +73,10 @@ public class AuditEventsJmxEndpoint extends AbstractJmxEndpoint {
private Date parseDate(String date) {
try {
return new SimpleDateFormat(DATE_FORMAT).parse(date);
if (StringUtils.hasLength(date)) {
return new SimpleDateFormat(DATE_FORMAT).parse(date);
}
return null;
}
catch (ParseException ex) {
throw new IllegalArgumentException(ex);

2
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/DataEndpointMBean.java

@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; @@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
/**
* Simple wrapper around {@link Endpoint} implementations that provide actuator data of
@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource; @@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
* @author Christian Dupuis
* @author Andy Wilkinson
*/
@ManagedResource
public class DataEndpointMBean extends EndpointMBean {
/**

2
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBean.java

@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; @@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
@ -35,7 +34,6 @@ import org.springframework.util.ObjectUtils; @@ -35,7 +34,6 @@ import org.springframework.util.ObjectUtils;
* @see JmxEndpoint
* @see DataEndpointMBean
*/
@ManagedResource
public abstract class EndpointMBean implements JmxEndpoint {
private final DataConverter dataConverter;

24
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporter.java

@ -46,9 +46,12 @@ import org.springframework.jmx.export.MBeanExporter; @@ -46,9 +46,12 @@ import org.springframework.jmx.export.MBeanExporter;
import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
import org.springframework.jmx.export.metadata.InvalidMetadataException;
import org.springframework.jmx.export.metadata.JmxAttributeSource;
import org.springframework.jmx.export.naming.MetadataNamingStrategy;
import org.springframework.jmx.export.naming.SelfNaming;
import org.springframework.jmx.support.ObjectNameManager;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
@ -70,7 +73,7 @@ public class EndpointMBeanExporter extends MBeanExporter @@ -70,7 +73,7 @@ public class EndpointMBeanExporter extends MBeanExporter
private static final Log logger = LogFactory.getLog(EndpointMBeanExporter.class);
private final AnnotationJmxAttributeSource attributeSource = new AnnotationJmxAttributeSource();
private final AnnotationJmxAttributeSource attributeSource = new EndpointJmxAttributeSource();
private final MetadataMBeanInfoAssembler assembler = new MetadataMBeanInfoAssembler(
this.attributeSource);
@ -253,8 +256,8 @@ public class EndpointMBeanExporter extends MBeanExporter @@ -253,8 +256,8 @@ public class EndpointMBeanExporter extends MBeanExporter
if (bean instanceof SelfNaming) {
return ((SelfNaming) bean).getObjectName();
}
if (bean instanceof EndpointMBean) {
return getObjectName((EndpointMBean) bean, beanKey);
if (bean instanceof JmxEndpoint) {
return getObjectName((JmxEndpoint) bean, beanKey);
}
return this.defaultNamingStrategy.getObjectName(bean, beanKey);
}
@ -363,4 +366,19 @@ public class EndpointMBeanExporter extends MBeanExporter @@ -363,4 +366,19 @@ public class EndpointMBeanExporter extends MBeanExporter
}
}
/**
* {@link JmxAttributeSource} for {@link JmxEndpoint JmxEndpoints}.
*/
private static class EndpointJmxAttributeSource extends AnnotationJmxAttributeSource {
@Override
public org.springframework.jmx.export.metadata.ManagedResource getManagedResource(
Class<?> beanClass) throws InvalidMetadataException {
Assert.state(super.getManagedResource(beanClass) == null,
"@ManagedResource annotation found on JmxEndpoint " + beanClass);
return new org.springframework.jmx.export.metadata.ManagedResource();
}
}
}

6
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/JmxEndpoint.java

@ -17,11 +17,13 @@ @@ -17,11 +17,13 @@
package org.springframework.boot.actuate.endpoint.jmx;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.jmx.export.annotation.ManagedResource;
/**
* A strategy for the JMX layer on top of an {@link Endpoint}. Implementations are allowed
* to use {@code @ManagedAttribute} and the full Spring JMX machinery. Implementations may
* be backed by an actual {@link Endpoint} or may be specifically designed for JMX only.
* to use {@code @ManagedAttribute} and the full Spring JMX machinery but should not use
* the {@link ManagedResource @ManagedResource} annotation. Implementations may be backed
* by an actual {@link Endpoint} or may be specifically designed for JMX only.
*
* @author Phillip Webb
* @since 1.5.0

2
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/LoggersEndpointMBean.java

@ -24,7 +24,6 @@ import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; @@ -24,7 +24,6 @@ import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.boot.logging.LogLevel;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.util.Assert;
/**
@ -33,7 +32,6 @@ import org.springframework.util.Assert; @@ -33,7 +32,6 @@ import org.springframework.util.Assert;
* @author Vedran Pavic
* @since 1.5.0
*/
@ManagedResource
public class LoggersEndpointMBean extends EndpointMBean {
public LoggersEndpointMBean(String beanName, Endpoint<?> endpoint,

2
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/ShutdownEndpointMBean.java

@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; @@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.ShutdownEndpoint;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
/**
* Special endpoint wrapper for {@link ShutdownEndpoint}.
@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource; @@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
* @author Christian Dupuis
* @author Andy Wilkinson
*/
@ManagedResource
public class ShutdownEndpointMBean extends EndpointMBean {
/**

Loading…
Cancel
Save