Все атрибуты JMX MXBean UNDEFINED — Spring 3.0.x/Tomcat 6.0

Я пытался заставить образец JMX MXBean работать в сконфигурированном Spring веб-приложении, но любые базовые атрибуты в MXBean появляются как UNDEFINED, когда я подключаюсь к 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;
    }
}

Конфигурация Spring JMX:

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

Вот что я знаю до сих пор:

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

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

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

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

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

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


person BobG    schedule 22.04.2011    source источник
comment
Если у вас есть решение, вы должны опубликовать его как ответ и отметить как принятое, а не добавлять его к вопросу.   -  person skaffman    schedule 24.05.2011
comment
@skaffman: я не знал, что делать, так как видел оба варианта на stackoverflow.com. Я отредактировал, сделал репост и отметил как ответ. Спасибо, что разъяснили это для меня!   -  person BobG    schedule 24.05.2011


Ответы (2)


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

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

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

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

person BobG    schedule 24.05.2011
comment
Спасибо БобГ. Рад, что смог помочь. - person Jon Stevens; 28.05.2011

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

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

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

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

https://github.com/lookfirst/fallback

person Jon Stevens    schedule 21.05.2011