Spring MBeanExporter - имя для MBean - PullRequest
4 голосов
/ 15 ноября 2011

Я пытаюсь запустить простое приложение с jmx-экспортированным методом. Я делаю это следующим образом (spring-context и cglib для "@Configuration" находятся в пути к классам):

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?

Ответы [ 3 ]

14 голосов
/ 12 сентября 2012

Вы можете использовать аннотации описаний, предоставленные Spring Context @ Managed *:

. Для этого вы НЕ должны реализовывать интерфейс с суффиксом "MBean" или "MXBean", а также SelfNaming.Затем компонент будет обнаружен как стандартный «управляемый компонент» пружины, когда MBeanExporter зарегистрируетBeanInstance (..) и будет преобразован в ModelMBean с использованием всех пружинных аннотаций, включая описания атрибутов, операций, параметров и т. Д.

Как требование, вы должны объявить в своем весеннем контексте атрибуты MBeanExporter с AnnotationJmxAttributeSource , MetadataNamingStrategy и MetadataMBeanInfoAssembler что можно упростить так:

<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, который был бы StandardMBean, и интерфейс SelfNaming, который обходил бы управление именами Spring!

3 голосов
/ 21 января 2014

Вы можете использовать KeyNamingStrategy , чтобы определить все связанные с JMX свойства в конфигурации XML без добавления каких-либо зависимостей времени компиляции в Spring в исходный код вашего MBean:

<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>

Есливы можете жить с произвольными именами объектов, затем вы можете использовать IdentityNamingStrategy в качестве стратегии именования для MBeanExporter и дополнительно минимизировать событие конфигурации 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"/>
1 голос
/ 15 ноября 2011

Проверьте документацию пружины: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jmx.html раздел 22.3.2 объясняет доступные аннотации JDK 5.0.

Раздел 22.4 объясняет механизмы для именования объектов.

...