значение действительного компонента в JMX-среде Spring и способы создания допустимого компонента для автоопределения MBeanExporter - PullRequest
0 голосов
/ 08 декабря 2018

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

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

В документах по ссылке здесь сказано, что

Если автоопределение включено, то действительные JMX-бины будут автоматическибыть зарегистрированным к весне.

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

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

Ниже приведен код:

application-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-бин любым способом, отличным от того, что есть в приведенном выше коде.

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

1 Ответ

0 голосов
/ 09 декабря 2018

Чтение документация пружины .

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

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

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

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

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

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

Чтобы еще больше упростить настройку, Spring включает в себя интерфейс AutodetectCapableMBeanInfoAssembler, который расширяет интерфейс ресурсов MBeanInfoAssembler для добавления поддержки автоопределения.Если вы сконфигурируете MBeanExporter с экземпляром AutodetectCapableMBeanInfoAssembler, ему будет разрешено «голосовать» за включение компонентов для представления в JMX.

Единственная реализация интерфейса AutodetectCapableMBeanInfo - это MetadataMBeanInfoAssembler, который любойbean-компонент, помеченный атрибутом ManagedResource....

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

...