如何在MBean描述中公开属性

时间:2016-01-14 08:43:09

标签: java spring properties jmx spring-jmx

项目中存在以下托管操作:

@ManagedOperation(description = "Some description")
@ManagedOperationParameters({
        @ManagedOperationParameter(name = "key", description = "Some description"),
})
public void foo(String key) {
    // some logic
}

还有一个属性可以在Spring上下文中使用,用美元符号和方括号括起来:

"${some.property.key}"

是否可以在托管操作注释描述中使用上述属性键的值?类似的东西:

@ManagedOperationParameter(name = "key", 
    description = "Some description, please note that the key is ${some.property.key}")

1 个答案:

答案 0 :(得分:1)

不是开箱即用的,但它很容易定制......

public class CustomAttributeSource extends AnnotationJmxAttributeSource implements EmbeddedValueResolverAware {

    private StringValueResolver embeddedValueResolver;

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.embeddedValueResolver = resolver;
    }

    @Override
    public ManagedAttribute getManagedAttribute(Method method) throws InvalidMetadataException {
        ManagedAttribute managedAttribute = super.getManagedAttribute(method);
        if (this.embeddedValueResolver != null) {
            managedAttribute
                    .setDescription(this.embeddedValueResolver.resolveStringValue(managedAttribute.getDescription()));
        }
        return managedAttribute;
    }

    @Override
    public ManagedOperation getManagedOperation(Method method) throws InvalidMetadataException {
        ManagedOperation managedOperation = super.getManagedOperation(method);
        if (this.embeddedValueResolver != null) {
            managedOperation
                    .setDescription(this.embeddedValueResolver.resolveStringValue(managedOperation.getDescription()));
        }
        return managedOperation;
    }

}

则...

<bean class="org.springframework.jmx.export.annotation.AnnotationMBeanExporter">
    <property name="assembler">
        <bean class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
            <property name="attributeSource">
                <bean class="foo.CustomAttributeSource" />
            </property>
        </bean>
    </property>
</bean>