2011-11-15 15 views
3

jmx-exportedメソッドを使って簡単なアプリケーションを実行しようとしています。私は(クラスパスにある「@Configuration」の春コンテキストとCGLIB)のようにそれを実行します。私はそれを実行したときにSpring MBeanExporter - MBeanに名前をつける

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の名前を指定する方が良い方法はありますか?

答えて

13

あなたは春のコンテキストが提供する記述の注釈@ *管理を使用することができます。 MBeanExporterがBeanInstance(..)を登録するときに、Beanは標準のバネ「マネージドBean」として検出され、属性、操作、パラメータなどの説明を含むすべてのスプリングアノテーションを使用してModelMBeanに変換されます。

要件として、あなたはAnnotationJmxAttributeSourceMetadataNamingStrategy、このように単純化することができるMetadataMBeanInfoAssembler属性、とあなたの春のコンテキストでMBeanExporterを宣言する必要があります。

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

または

<context:mbean-export /> 

そして、あなたの管理Beanは次のようになります。

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

春を迂回することになる、StandardMBeanのでしょうMBeanインタフェース、およびSelfNamingインタフェースを実装していないことを忘れないでくださいネーミング管理!

+0

おかげで多くのことを。この答えを変更してxmlを持たないようにするのはとても簡単です。もし誰かがそれを必要とするなら、コメントに注意してください。 –

+0

私は本当にxmlなしでそれを持っていただければ幸いです!私は立ち往生しています.... – user16655

1

チェック・スプリング・ドキュメント:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jmx.htmlセクション22.3.2では、使用可能なJDK 5.0アノテーションについて説明しています。

第22.4節では、オブジェクトの命名に使用できるメカニズムについて説明します。

はこれを行うには、「MBeanの」または「MXBeanの」接尾辞、どちらSelfNamingとのインタフェースを実装してはいけません:

3

あなたのMBeanのソースコードに春に任意のコンパイル時の依存関係を追加することなく、XML構成内のすべてのJMX関連のプロパティを定義するKeyNamingStrategyを使用することができます:あなたは、ある程度任意で暮らすことができる場合

<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の命名戦略としてIdentityNamingStrategyを使用することができ、さらに、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"/> 
+0

これはうまくいきました – aliopi