Публикация JMX-уведомлений при использовании Spring без NotificationPublisherAware - PullRequest
1 голос
/ 03 марта 2011

Я хотел бы публиковать уведомления JMX с помощью Spring 3, но хотел бы избегать использования интерфейса NotificationPublisherAware, поскольку код также используется приложением, которое не использует Spring. Боб экспонируется с использованием бина MBeanExporter. Альтернативы, которые я нашел, требуют регистрации mbeans, что я сейчас и делаю, используя конфигурацию Spring, так что это плохой вариант. Есть ли способ избежать использования интерфейса NotificationPublisherAware, но при этом публиковать уведомления?

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Вам не нужно использовать какой-либо класс Spring в коде. Пример:

Интерфейс:

import javax.management.MXBean;


@MXBean
public interface SecurityEventsManagerMXBean {
...

    @AttributeMetaData(value="UserLoginFailures", defaultValue="0",  description="Total user login failures")
    public int getUserLoginFailureCount() ;
 ...    
}

Bean:

import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;

public class SecurityEventsManager extends NotificationBroadcasterSupport implements SecurityEventsManagerMXBean {

    ...
    private void notifyUserLoginFailure(...) {

        Notification notification  = new Notification(...) ;
        sendNotification(notification)
        userLoginFailureCount++ ;
    }

}

Здесь @AttributeMetaData представляет собой удобную метааннотацию, которая определяет ключи дескриптора:

import javax.management.DescriptorKey;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AttributeMetaData {
    @DescriptorKey("displayName")
    String value();
    ....
}

Редактировать март 08. Конфигурация для экспорта выше Mbean:

    <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean" 
p:locateExistingServerIfPossible="true" />

   <bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>

    <bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy" 
    p:attributeSource-ref="jmxAttributeSource" />


    <bean id="assembler"  class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler" 
    p:attributeSource-ref="jmxAttributeSource" />

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
    <property name="server" ref="mbeanServer"/>
    <property name="assembler" ref="assembler"/>
    <property name="registrationBehaviorName" value="REGISTRATION_FAIL_ON_EXISTING"/>
    <property name="beans">
        <map>
            <entry>
                <key>
                    <util:constant
                        static-field="x.y.z.SecurityEventsManager.OBJECT_NAME" />
                </key>
                <ref bean="securityEventsManager" />
            </entry>
        </map>
    </property>
</bean>

<bean id="securityEventsManager" class="x.y.z.SecurityEventsManager" />
0 голосов
/ 19 января 2013

В соответствии с документацией Spring:

Интерфейс NotificationPublisher и механизм его работы - одна из замечательных особенностей поддержки Spring JMX.Тем не менее, он поставляется с ценой соединения ваших классов с Spring и JMX;как всегда, совет здесь должен быть прагматичным ... если вам нужна функциональность, предлагаемая NotificationPublisher, и вы можете принять соединение с Spring и JMX, то сделайте это.

Ссылка: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch24s07.html#jmx-notifications-listeners

...