Search code examples
javaspringjmxmbeansspring-jmx

Name for @ManagedOperation in Spring JMX


I used org.springframework.jmx.export.annotation.@ManagedOperation to expose a method as MBean.

I want the operation name different from the method name, but managed operation doesn't have any attribute for it.

For example:

@ManagedOperation
public synchronized void clearCache() 
{
   // do something
}

and I want this operation exposed with name = "ResetCache".


Solution

  • Create a custom annotation:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface JmxName {
        String value();
    }
    

    And a custom subclass of MetadataMBeanInfoAssembler:

    public class CustomMetadataMBeanInfoAssembler extends MetadataMBeanInfoAssembler {
    
        private String getName(final Method method) {
            final JmxName annotation = method.getAnnotation(JmxName.class);
            if (annotation != null) {
                return annotation.value();
            }else
                return method.getName();
            }
        }
        protected ModelMBeanOperationInfo createModelMBeanOperationInfo(Method method, String name, String beanKey) {
                return new ModelMBeanOperationInfo(getName(method),
                    getOperationDescription(method, beanKey),
                    getOperationParameters(method, beanKey),
                    method.getReturnType().getName(),
                    MBeanOperationInfo.UNKNOWN);
        }
    
    }
    

    and you should get it to work if you wire the CustomMetadataMBeanInfoAssembler (and use the annotation):

    <bean id="jmxAttributeSource"
          class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
    
    <!-- will create management interface using annotation metadata -->
    <bean id="assembler"
          class="com.yourcompany.some.path.CustomMetadataMBeanInfoAssembler">
        <property name="attributeSource" ref="jmxAttributeSource"/>
    </bean>