Все атрибуты JMX MXBean НЕ УКАЗАНЫ - Spring 3.0.x / Tomcat 6.0 - PullRequest
1 голос
/ 23 апреля 2011

Я пытался получить пример 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;
    }
}

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

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

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

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

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

1 голос
/ 21 мая 2011

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

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

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

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

https://github.com/lookfirst/fallback

...