Значение действительного bean-компонента в JMX-фреймворке Spring и способы создания действительного bean-компонента для автоматического определения MBeanExporter

Я новичок в Spring, и в настоящее время я изучаю поддержку jmx, которую предоставляет Spring. Я понимаю, что MBeanExporter - один из основных классов JMX-фреймворка Spring. Так что я пытался поиграть с этим. (Я следую руководству, предоставленному здесь)

Я пытаюсь поэкспериментировать со свойством autodetectMBeanExporter. Но не знаю, правильно я это понимаю или нет.

Документы по ссылке здесь говорят, что

If autodetect is enabled, then valid JMX-beans will automatically be registered by spring.

Теперь я не понимаю, что на самом деле означает bean-компонент bean-jmx. Я понимаю, что каждый jmx-bean должен иметь имя объекта и должен реализовывать интерфейс, имя которого должно быть именем класса с суффиксом «MBean». Есть ли еще какое-то ограничение, которое мне не хватает?

Функция автоматического определения MBeanExporter работает хорошо, когда я удовлетворяю этим двум ограничениям. Но я чувствую, что при использовании spring должны быть другие способы создания действительного jmx-bean, о которых я не знаю. Не могли бы вы указать мне на это?

Вот код:

приложение-context.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "mBenaServer" class = "org.springframework.jmx.support.MBeanServerFactoryBean">
        <property name = "locateExistingServerIfPossible" value = "true"/>
    </bean>

    <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter" lazy-init = "false">
        <property name = "server" ref = "mBenaServer"/>
        <!--<property name = "beans">-->
            <!--<map>-->
                <!--<entry key = "com.mybean:name=testBean1" value-ref = "personBean"/>-->
            <!--</map>-->
        <!--</property>-->
        <property name = "autodetect" value = "true"/>
    </bean>

    <bean id = "personBean" class = "com.jmx.trial.Person" lazy-init = "true">
        <property name = "name" value = "Lavish"/>
        <property name = "age" value = "25"/>
    </bean>

</beans>

PersonMBean.java

package com.jmx.trial;

public interface PersonMBean {
    void setName(String name);
    void setAge(int age);
    String getName();
    int getAge();
}

Person.java

package com.jmx.trial;

import org.springframework.jmx.export.naming.SelfNaming;

import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;

public class Person implements PersonMBean, SelfNaming {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public ObjectName getObjectName() throws MalformedObjectNameException {
        return new ObjectName("custom.bean:name=testbean");
    }
}

Main.java

package com.jmx.trial;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    private static Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");

        Person p = (Person) context.getBean("personBean");
        System.out.println(p.getName());
        System.out.println(p.getAge());

        logger.debug("Started, now waiting");
        Thread.sleep(Long.MAX_VALUE);
    }
}

Я ищу, можно ли создать действительный jmx-bean каким-либо образом, кроме того, что указано в приведенном выше коде.

Не знаю, связано ли это с ManagedResource. Если да, то я хотел бы получить указатели на подробное объяснение этого. Я пробовал читать об этом в spring / docs, но для меня это не прошло гладко.

Я нашел эта ссылка очень полезным.

Lavish Kothari 09.12.2018 19:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
265
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прочтите весенняя документация.

Spring добавляет слой поверх традиционного JMX.

В традиционном JMX MBean - это компонент, скажем, Foo, с интерфейсом открытых атрибутов и операций FooMBean.

autDetect в этом контексте просто означает автоматическое обнаружение таких интерфейсов на любых bean-компонентах, объявленных в контексте приложения, и их регистрацию.

Spring позволяет bean-компоненту любой быть представленным как MBean-компонент (для него не требуется интерфейс). Вместо этого вы выбираете один из несколько механизмов для выбора отображаемых атрибутов / операций, но, как правило, вы должны указать экспортеру, какие bean-компоненты вы хотите открыть. Вероятно, вы никогда не захотите, чтобы каждый компонент в контексте приложения был открыт.

Аннотированная модель, наверное, самая простая (@ManagedResource с @ManagedAttribute, @ManagedOperation).

Реализация AutodetectCapableMBeanInfoAssembler, предоставляемая платформой, обнаруживает эти аннотации.

To simplify configuration even further, Spring includes the AutodetectCapableMBeanInfoAssembler interface, which extends the MBeanInfoAssembler interface to add support for autodetection of MBean resources. If you configure the MBeanExporter with an instance of AutodetectCapableMBeanInfoAssembler, it is allowed to “vote” on the inclusion of beans for exposure to JMX.

The only implementation of the AutodetectCapableMBeanInfo interface is the MetadataMBeanInfoAssembler, which votes to include any bean that is marked with the ManagedResource attribute. ...

Но вы можете написать свой собственный, если хотите еще больше автоопределения.

Большое спасибо! ваш ответ был очень полезным :)

Lavish Kothari 09.12.2018 19:29

Другие вопросы по теме