복붙노트

[SPRING] Spring MBeanExporter - MBean에 이름 지정하기

SPRING

Spring MBeanExporter - MBean에 이름 지정하기

내가 jmx - 수출 방법으로 간단한 응용 프로그램을 실행하려고 해요. 나는 그것을 좋아한다 (스프링 컨텍스트와 "@Configuration"을위한 cglib는 classpath 안에있다) :

package com.sopovs.moradanen.jmx;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jmx.export.MBeanExporter;
import org.springframework.stereotype.Component;

@Component
@Configuration
public class SpringJmxTest {
public static void main(String[] args) {
    new AnnotationConfigApplicationContext("com.sopovs.moradanen.jmx");
    while (true) {
        Thread.yield();
    }
}

@Bean
public MBeanExporter createJmxExporter() {
    return new MBeanExporter();
}

public interface FooBarMBean {
    public String hello();
}

@Component
public static class FooBar implements FooBarMBean {
    @Override
    public String hello() {
        return "Hello";
    }
}
}

그러나 그것을 실행할 때 얻을 : javax.management.MalformedObjectNameException : 키 속성을 비워 둘 수 없습니다. 디버깅을 시도하고 함께 해결할 :

@Component
public static class FooBar implements FooBarMBean, SelfNaming {
    @Override
    public String hello() {
        return "Hello";
    }

    @Override
    public ObjectName getObjectName() throws MalformedObjectNameException {
        return new ObjectName("fooBar:name=" + getClass().getName());
    }
}

그러나 MBean에 이름을 제공하는 더 좋은 방법이 있습니까?

해결법

  1. ==============================

    1.Spring Context @ Managed *에서 제공하는 description 어노테이션을 사용할 수있다.

    Spring Context @ Managed *에서 제공하는 description 어노테이션을 사용할 수있다.

    이렇게하려면 "MBean"또는 "MXBean"접미사가있는 인터페이스를 구현하지 말아야하며 SelfNaming이 아니어야합니다. MBeanExporter가 BeanInstance (..)를 등록하면 (자), bean는 표준의 스프링 「관리 빈」으로서 검출되어 속성, 조작, 파라미터 등의 설명을 포함한 모든 스프링 주석을 사용해 ModelMBean에 변환됩니다.

    요구 사항으로 스프링 컨텍스트에서 annotationJmxAttributeSource, MetadataNamingStrategy 및 MetadataMBeanInfoAssembler 특성을 사용하여 MBeanExporter를 선언해야하며 다음과 같이 단순화 할 수 있습니다.

    <bean id="mbeanExporter"
         class="org.springframework.jmx.export.annotation.AnnotationMBeanExporter" />
    

    또는

    <context:mbean-export />
    

    그리고 관리 빈은 다음과 같이 보일 것입니다.

    @Component("myManagedBean")
    @ManagedResource(objectName="your.domain.jmx:name=MyMBean",
                     description="My MBean goal")
    public class AnnotationTestBean {
    
        private int age;
    
        @ManagedAttribute(description="The age attribute", currencyTimeLimit=15)
        public int getAge() {
            return age;
        }
    
        @ManagedOperation(description = "Check permissions for the given activity")
        @ManagedOperationParameters( {
            @ManagedOperationParameter(name = "activity",
                                       description = "The activity to check")
        })
        public boolean isAllowedTo(final String activity) {
            // impl
        }
    }
    

    표준 MBean과 SelfNaming 인터페이스 인 MBean 인터페이스를 구현하지 말아야한다는 것을 명심하십시오. 이는 스프링 명명 관리를 우회합니다!

  2. ==============================

    2.KeyNamingStrategy를 사용하여 Spring에 대한 컴파일 타임 종속성을 MBean의 소스 코드에 추가하지 않고 XML 구성 내의 모든 JMX 관련 등록 정보를 정의 할 수 있습니다.

    KeyNamingStrategy를 사용하여 Spring에 대한 컴파일 타임 종속성을 MBean의 소스 코드에 추가하지 않고 XML 구성 내의 모든 JMX 관련 등록 정보를 정의 할 수 있습니다.

    <bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
        <property name="namingStrategy" ref="namingStrategy"/>
    </bean>
    <bean id="namingStrategy"
            class="org.springframework.jmx.export.naming.KeyNamingStrategy">
        <property name="mappings">
            <props>
                <prop key="someSpringBean">desired.packageName:name=desiredBeanName</prop>
            </props>
        </property>
    </bean>
    

    다소 임의의 객체 이름을 가지고 살 수 있다면 MBeanExporter의 명명 전략으로 Identity NamingStrategy를 사용하고 XML 구성 이벤트를 더 최소화 할 수 있습니다.

    <bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
        <property name="namingStrategy" ref="namingStrategy"/>
    </bean>
    <bean id="namingStrategy"
            class="org.springframework.jmx.export.naming.IdentityNamingStrategy"/>
    
  3. ==============================

    3.Check Spring 설명서 : http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jmx.html 22.3.2 절에서 사용할 수있는 JDK 5.0 주석에 대해 설명합니다.

    Check Spring 설명서 : http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jmx.html 22.3.2 절에서 사용할 수있는 JDK 5.0 주석에 대해 설명합니다.

    22.4 절에서는 객체 명명에 사용할 수있는 메커니즘을 설명합니다.

  4. from https://stackoverflow.com/questions/8137983/spring-mbeanexporter-giving-name-to-mbean by cc-by-sa and MIT license