Все атрибуты JMX MXBean не ОПРЕДЕЛЕНЫ — Spring 3.0.x / Tomcat 6.0

#java #spring #tomcat #jmx

#java #spring #tomcat #jmx

Вопрос:

Я пытался заставить образец JMX MXBean работать в веб-приложении, настроенном на Spring, но любые базовые атрибуты MXBean отображаются как НЕОПРЕДЕЛЕННЫЕ при подключении к jconsole.

Интерфейс Java / классы:

 public interface IJmxBean { // marker interface for spring config, see below
}

public interface MgmtMXBean { // lexical convention for MXBeans - mgmt interface
    public int getAttribute();
}

public class Mgmt implements IJmxBean, MgmtMXBean { // actual JMX bean
    private IServiceBean serviceBean;    // service bean injected by Spring
    private int attribute = 0;

    @Override
    public int getAttribute() {
        if(serviceBean != null) {
            attribute = serviceBean.getRequestedAttribute();
        }
        return attribute;
    }

    public void setServiceBean(IServiceBean serviceBean) { 
        this.serviceBean = serviceBean;
    }
}
  

Весенняя конфигурация JMX:

 <beans>
    <context:component-scan base-package="...">
        <context:include-filter type="assignable" expression="...IJmxBean" />
    </context:component-scan>
    <context:mbean-export />
</beans>
  

Вот что я знаю на данный момент:

  • Элемент корректно создает экземпляр компонента с именем «mgmt». У меня есть регистрация в общедоступном конструкторе с нулевым аргументом, который указывает, что он создается.

  • корректно автоматически обнаруживает и регистрирует интерфейс MgmtMXBean в моем контейнере Tomcat 6.0. Я могу подключиться к MBeanServer в Tomcat с помощью jconsole и перейти к Mgmt MXBean.

  • При проверке MXBean «Атрибут» всегда указан как НЕОПРЕДЕЛЕННЫЙ, но jconsole может указать правильный тип атрибута. Кроме того, нажатие «Обновить» в jconsole фактически не вызывает метод получения «Атрибута» — у меня есть регистрация в методе getter, чтобы указать, вызывается ли он (аналогично регистрации конструктора, которая работает), и я ничего не вижу в журналах.

На данный момент я не уверен, что я делаю неправильно. Я пробовал несколько способов, включая создание явного экземпляра Spring MBeanExporter и регистрацию MXBean вручную, но это приводит либо к тому, что MBean / MXBean не регистрируется на сервере MBean Tomcat, либо к значению атрибута UNDEFINED.

По разным причинам я бы предпочел не использовать аннотации Spring @ManagedResource / @ManagedAttribute.

Есть ли что-то, чего мне не хватает в Spring docs или спецификациях MBean / MXBean?

Комментарии:

1. Если у вас есть решение, то вам следует опубликовать его в качестве ответа и пометить как принятое, а не добавлять к вопросу

2. @skaffman: Я не был уверен, что делать, поскольку я видел оба способа на stackoverflow.com . Я отредактировал, перепостил и пометил это как ответ. Спасибо, что разъяснили это для меня!

Ответ №1:

ПРОБЛЕМА РЕШЕНА: Благодаря подсказке Джона Стивенса (выше) я вернулся и повторно проверил свой код и файлы конфигурации Spring:

Создание исключения в getAttribute() методе — это верный способ заставить «Недоступный» отображаться в качестве значения атрибута в JConsole. В моем случае:

  • В файле конфигурации Spring JMX, который я использовал, отсутствовал default-autowire="" атрибут для корневого <beans> элемента;
  • Приведенный выше код проверяет, является ли serviceBean != null . Очевидно, я пишу лучший код на stackoverflow.com чем в моем тестовом коде, поскольку мой тестовый код не проверял это. Мне также не нужно было implements InitializingBean проверять @PostConstruct , как я обычно делаю почти со всеми другими компонентами, которые я использую. serviceBean != null ;
  • Код, вызывающий компонент service bean, был перед протоколированием, поэтому я никогда не видел сообщений журнала о вводимых методах получения;
  • JConsole не сообщает, когда методы атрибута генерируют исключения;
  • NPE не отображался в журналах Tomcat.

Как только я решил проблему с serviceBean == null , все заработало отлично. Несмотря на это, 1 Джону за предоставление рабочей демонстрации, поскольку в Spring существует буквально 50 различных способов настройки MBeans / MXBeans.

Ответ №2:

Недавно я создал пример веб-приложения на основе Spring, которое очень четко поддерживает JMX для последних версий Spring, Hibernate и Ehcache.

В нем есть примеры как для доступа на основе EntityManager, так и для доступа DAO (включая транзакции!). В нем также показано, как выполнить внедрение на основе аннотаций, чтобы исключить необходимость использования XML-конфигурации Spring для компонентов. Существует даже пример сервлета на основе SpringMVC, использующий аннотации. По сути, это версия довольно мощного сервера приложений на базе Spring, работающая поверх любого движка сервлетов.

Это еще не задокументировано, но я скоро к этому вернусь. Взгляните на файлы конфигурации и исходный код, и это должно быть довольно ясно.

Мотивация, стоящая за этим, заключается в том, что я устал от всех сумасшедших постов в блогах с 50 различными способами настройки и, наконец, создал единый простой источник, с которым люди могут работать. Это доступно на github, поэтому не стесняйтесь разветвлять проект и делать с ним все, что захотите.

https://github.com/lookfirst/fallback