2011-03-03 44 views
1

我想使用Spring 3發佈JMX通知,但想避免使用NotificationPublisherAware接口,因爲代碼也被不使用Spring的應用程序使用。該bean使用MBeanExporter bean公開。我發現的替代方案需要註冊mbeans,我目前使用Spring配置,所以這是一個糟糕的選擇。 有沒有辦法避免使用NotificationPublisherAware界面,但仍發佈通知?發佈使用Spring的JMX通知沒有NotificationPublisherAware

回答

1

你不必在代碼中使用任何Spring類。例如:

接口:

import javax.management.MXBean; 


@MXBean 
public interface SecurityEventsManagerMXBean { 
... 

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

豆:

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

按春文檔:

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

+0

@Vikarm我不知道你的答案如何與OP的問題。我認爲OP的問題非常清楚,OP不希望將他的代碼耦合到Spring。我不確定對JMX有什麼保留,現在它已成爲Java SE平臺的一部分。 – Ritesh 2013-04-05 18:19:21