2011-03-21 5 views
4

Я занимаюсь реализацией решения для мониторинга с использованием JMX. Мне нужно выставить определенные атрибуты, которые в основном будут счетчиками для клиента JMX. Я использовал Spring, чтобы зацепить все, что отлично работает.Обновление атрибутов JMX MBean без способа отображения клиенту

Ниже мой MBean класс:

@Component 
@ManagedResource(objectName="org.samples:type=Monitoring,name=Sample") 
public class JmxMonitorServiceImpl implements JmxMonitorService { 

    private AtomicInteger counter = new AtomicInteger(0); 

    @Override 
    public int incrementCounter() { 
    return counter.incrementAndGet(); 
    } 

    @ManagedAttribute(description="Current Counter value") 
    public int getCounter() { 
    return counter.intValue(); 
    } 

    @Override 
    @ManagedOperation(description="Reset the Counter to Zero") 
    public void resetCounter() { 
    counter.set(0); 
    } 

} 

В MBean атрибуты получить подвергаются, как и ожидалось, поэтому у меня нет никаких проблем там. Моя проблема возникает в том месте, где я хочу увеличить счетчик.

Из фрагмента выше вы увидите, что метод «incrementCounter» не содержит аннотации @ManagedOperation. Причина в том, что я не хочу раскрывать это клиенту JMX и хочу использовать его только внутри своих компонентов.

Единственный способ заставить его работать с MBean из нескольких компонентов заключался в создании прокси-объекта. Здесь я также использую Spring, извлечь из контекста ниже:

<bean id="jmxMonitorServiceProxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean"> 
    <property name="objectName" value="org.samples:type=Monitoring,name=Sample" /> 
    <property name="proxyInterface" value="org.samples.monitoring.JmxMonitorService" /> 
</bean> 

С помощью этого прокси теперь я могу взаимодействовать с моим MBean, но для того, чтобы увеличить значение счетчика, мне нужно поставить @ManagedOperation аннотацию на методе иначе я получаю исключение,

Операция incrementCounter не ModelMBeanInfo

Если MBean использовался только внутри 1 компонента я мог бы преодолеть эту проблему, потому что весна выставляет фактический класс Instan для меня, но, как только вы используете один и тот же MBean в нескольких компонентах, он создает экземпляр собственного экземпляра.

Итак, после длинного объяснения :), мой вопрос в том, может ли разоблачение этих чувствительных методов через прокси-сервер - единственный способ использовать MBean через компоненты или есть кто-то, кто может указать мне в правильном направлении?

Порадуйтесь ответов :)

ответ

2

Переместите счетчик на другой боб и впрыснуть, что во всех случаях MBean.

+0

Спасибо за ответ Аарон. Если я переведу счетчик к другому компоненту, как бы я удостоверился, что у меня одинаковое значение счетчика для всех компонентов? Если он находится внутри MBean, сервер будет управлять этим для вас. – charlv

+1

@charlv: Он означает переместить 'AtomicInteger' в новый класс, у которого нет аннотаций JMX, а затем сделать этот новый класс в bean-компоненте. Затем вставьте этот компонент в два новых компонента, каждый из которых реализует собственный интерфейс JMX. – skaffman

Смежные вопросы