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
This commit is contained in:
parent
76d5b913cd
commit
8a9a61b64f
|
@ -22,7 +22,6 @@ import org.springframework.boot.actuate.endpoint.Endpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.EndpointProperties;
|
import org.springframework.boot.actuate.endpoint.EndpointProperties;
|
||||||
import org.springframework.context.EnvironmentAware;
|
import org.springframework.context.EnvironmentAware;
|
||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
||||||
import org.springframework.jmx.export.annotation.ManagedResource;
|
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,7 +32,6 @@ import org.springframework.util.ObjectUtils;
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
* @since 1.5.0
|
* @since 1.5.0
|
||||||
*/
|
*/
|
||||||
@ManagedResource
|
|
||||||
public abstract class AbstractJmxEndpoint implements JmxEndpoint, EnvironmentAware {
|
public abstract class AbstractJmxEndpoint implements JmxEndpoint, EnvironmentAware {
|
||||||
|
|
||||||
private final DataConverter dataConverter;
|
private final DataConverter dataConverter;
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.springframework.boot.actuate.audit.AuditEventRepository;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.jmx.export.annotation.ManagedOperation;
|
import org.springframework.jmx.export.annotation.ManagedOperation;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link JmxEndpoint} for {@link AuditEventRepository}.
|
* {@link JmxEndpoint} for {@link AuditEventRepository}.
|
||||||
|
@ -72,8 +73,11 @@ public class AuditEventsJmxEndpoint extends AbstractJmxEndpoint {
|
||||||
|
|
||||||
private Date parseDate(String date) {
|
private Date parseDate(String date) {
|
||||||
try {
|
try {
|
||||||
|
if (StringUtils.hasLength(date)) {
|
||||||
return new SimpleDateFormat(DATE_FORMAT).parse(date);
|
return new SimpleDateFormat(DATE_FORMAT).parse(date);
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
catch (ParseException ex) {
|
catch (ParseException ex) {
|
||||||
throw new IllegalArgumentException(ex);
|
throw new IllegalArgumentException(ex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.endpoint.Endpoint;
|
import org.springframework.boot.actuate.endpoint.Endpoint;
|
||||||
import org.springframework.jmx.export.annotation.ManagedAttribute;
|
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
|
* Simple wrapper around {@link Endpoint} implementations that provide actuator data of
|
||||||
|
@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
|
||||||
* @author Christian Dupuis
|
* @author Christian Dupuis
|
||||||
* @author Andy Wilkinson
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
@ManagedResource
|
|
||||||
public class DataEndpointMBean extends EndpointMBean {
|
public class DataEndpointMBean extends EndpointMBean {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.endpoint.Endpoint;
|
import org.springframework.boot.actuate.endpoint.Endpoint;
|
||||||
import org.springframework.jmx.export.annotation.ManagedAttribute;
|
import org.springframework.jmx.export.annotation.ManagedAttribute;
|
||||||
import org.springframework.jmx.export.annotation.ManagedResource;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
|
@ -35,7 +34,6 @@ import org.springframework.util.ObjectUtils;
|
||||||
* @see JmxEndpoint
|
* @see JmxEndpoint
|
||||||
* @see DataEndpointMBean
|
* @see DataEndpointMBean
|
||||||
*/
|
*/
|
||||||
@ManagedResource
|
|
||||||
public abstract class EndpointMBean implements JmxEndpoint {
|
public abstract class EndpointMBean implements JmxEndpoint {
|
||||||
|
|
||||||
private final DataConverter dataConverter;
|
private final DataConverter dataConverter;
|
||||||
|
|
|
@ -46,9 +46,12 @@ import org.springframework.jmx.export.MBeanExporter;
|
||||||
import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
|
import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
|
||||||
import org.springframework.jmx.export.annotation.ManagedResource;
|
import org.springframework.jmx.export.annotation.ManagedResource;
|
||||||
import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
|
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.MetadataNamingStrategy;
|
||||||
import org.springframework.jmx.export.naming.SelfNaming;
|
import org.springframework.jmx.export.naming.SelfNaming;
|
||||||
import org.springframework.jmx.support.ObjectNameManager;
|
import org.springframework.jmx.support.ObjectNameManager;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,7 +73,7 @@ public class EndpointMBeanExporter extends MBeanExporter
|
||||||
|
|
||||||
private static final Log logger = LogFactory.getLog(EndpointMBeanExporter.class);
|
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(
|
private final MetadataMBeanInfoAssembler assembler = new MetadataMBeanInfoAssembler(
|
||||||
this.attributeSource);
|
this.attributeSource);
|
||||||
|
@ -253,8 +256,8 @@ public class EndpointMBeanExporter extends MBeanExporter
|
||||||
if (bean instanceof SelfNaming) {
|
if (bean instanceof SelfNaming) {
|
||||||
return ((SelfNaming) bean).getObjectName();
|
return ((SelfNaming) bean).getObjectName();
|
||||||
}
|
}
|
||||||
if (bean instanceof EndpointMBean) {
|
if (bean instanceof JmxEndpoint) {
|
||||||
return getObjectName((EndpointMBean) bean, beanKey);
|
return getObjectName((JmxEndpoint) bean, beanKey);
|
||||||
}
|
}
|
||||||
return this.defaultNamingStrategy.getObjectName(bean, beanKey);
|
return this.defaultNamingStrategy.getObjectName(bean, beanKey);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,11 +17,13 @@
|
||||||
package org.springframework.boot.actuate.endpoint.jmx;
|
package org.springframework.boot.actuate.endpoint.jmx;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.endpoint.Endpoint;
|
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
|
* 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
|
* to use {@code @ManagedAttribute} and the full Spring JMX machinery but should not use
|
||||||
* be backed by an actual {@link Endpoint} or may be specifically designed for JMX only.
|
* 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
|
* @author Phillip Webb
|
||||||
* @since 1.5.0
|
* @since 1.5.0
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
|
||||||
import org.springframework.boot.logging.LogLevel;
|
import org.springframework.boot.logging.LogLevel;
|
||||||
import org.springframework.jmx.export.annotation.ManagedAttribute;
|
import org.springframework.jmx.export.annotation.ManagedAttribute;
|
||||||
import org.springframework.jmx.export.annotation.ManagedOperation;
|
import org.springframework.jmx.export.annotation.ManagedOperation;
|
||||||
import org.springframework.jmx.export.annotation.ManagedResource;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,7 +32,6 @@ import org.springframework.util.Assert;
|
||||||
* @author Vedran Pavic
|
* @author Vedran Pavic
|
||||||
* @since 1.5.0
|
* @since 1.5.0
|
||||||
*/
|
*/
|
||||||
@ManagedResource
|
|
||||||
public class LoggersEndpointMBean extends EndpointMBean {
|
public class LoggersEndpointMBean extends EndpointMBean {
|
||||||
|
|
||||||
public LoggersEndpointMBean(String beanName, Endpoint<?> endpoint,
|
public LoggersEndpointMBean(String beanName, Endpoint<?> endpoint,
|
||||||
|
|
|
@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.springframework.boot.actuate.endpoint.Endpoint;
|
import org.springframework.boot.actuate.endpoint.Endpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.ShutdownEndpoint;
|
import org.springframework.boot.actuate.endpoint.ShutdownEndpoint;
|
||||||
import org.springframework.jmx.export.annotation.ManagedOperation;
|
import org.springframework.jmx.export.annotation.ManagedOperation;
|
||||||
import org.springframework.jmx.export.annotation.ManagedResource;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Special endpoint wrapper for {@link ShutdownEndpoint}.
|
* Special endpoint wrapper for {@link ShutdownEndpoint}.
|
||||||
|
@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
|
||||||
* @author Christian Dupuis
|
* @author Christian Dupuis
|
||||||
* @author Andy Wilkinson
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
@ManagedResource
|
|
||||||
public class ShutdownEndpointMBean extends EndpointMBean {
|
public class ShutdownEndpointMBean extends EndpointMBean {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue