问题
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".
回答1:
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>
回答2:
I would just define another method that just delegates to clearCache()
. We do this all of the time when the interface name is confusing. A description = "resets the cache"
inside of the @ManagedOperation
might also be a good idea.
@ManagedOperation(description = "resets the cache")
public void resetCache() {
clearCache();
}
来源:https://stackoverflow.com/questions/8910064/name-for-managedoperation-in-spring-jmx