Я занимаюсь реализацией решения для мониторинга с использованием 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 через компоненты или есть кто-то, кто может указать мне в правильном направлении?
Порадуйтесь ответов :)
Спасибо за ответ Аарон. Если я переведу счетчик к другому компоненту, как бы я удостоверился, что у меня одинаковое значение счетчика для всех компонентов? Если он находится внутри MBean, сервер будет управлять этим для вас. – charlv
@charlv: Он означает переместить 'AtomicInteger' в новый класс, у которого нет аннотаций JMX, а затем сделать этот новый класс в bean-компоненте. Затем вставьте этот компонент в два новых компонента, каждый из которых реализует собственный интерфейс JMX. – skaffman