Bean の ObjectName インスタンスの制御
バックグラウンドでは、MBeanExporter は ObjectNamingStrategy の実装に委譲して、登録する各 Bean の ObjectName インスタンスを取得します。デフォルトでは、デフォルトの実装である KeyNamingStrategy は、beans Map のキーを ObjectName として使用します。さらに、KeyNamingStrategy は、beans Map のキーを Properties ファイル(または複数のファイル)のエントリにマップして、ObjectName を解決することができます。KeyNamingStrategy に加えて、Spring は 2 つの追加の ObjectNamingStrategy 実装を提供します。IdentityNamingStrategy (Bean の JVM ID に基づいて ObjectName を構築します)と MetadataNamingStrategy (ソースレベルのメタデータを使用して ObjectName を取得します)です。
プロパティからの ObjectName インスタンスの読み取り
独自の KeyNamingStrategy インスタンスを構成し、Bean キーを使用するのではなく、Properties インスタンスから ObjectName インスタンスを読み取るように構成できます。KeyNamingStrategy は、Bean キーに対応するキーを使用して、Properties のエントリを見つけようとします。エントリが見つからない場合、または Properties インスタンスが null の場合、Bean キー自体が使用されます。
次のコードは、KeyNamingStrategy のサンプル構成を示しています。
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="testBean" value-ref="testBean"/>
</map>
</property>
<property name="namingStrategy" ref="namingStrategy"/>
</bean>
<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
<bean id="namingStrategy" class="org.springframework.jmx.export.naming.KeyNamingStrategy">
<property name="mappings">
<props>
<prop key="testBean">bean:name=testBean1</prop>
</props>
</property>
<property name="mappingLocations">
<value>names1.properties,names2.properties</value>
</property>
</bean>
</beans> 上記の例では、KeyNamingStrategy のインスタンスを、マッピングプロパティで定義された Properties インスタンスと、マッピングプロパティで定義されたパスにあるプロパティファイルからマージされた Properties インスタンスで構成します。この構成では、Bean キーに対応するキーを持つ Properties インスタンスのエントリであるため、testBean Bean には bean:name=testBean1 の ObjectName が与えられます。
Properties インスタンスにエントリが見つからない場合、Bean キー名が ObjectName として使用されます。
MetadataNamingStrategy を使用する
MetadataNamingStrategy は、各 Bean の ManagedResource 属性の objectName プロパティを使用して、ObjectName を作成します。次のコードは、MetadataNamingStrategy の構成を示しています。
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="testBean" value-ref="testBean"/>
</map>
</property>
<property name="namingStrategy" ref="namingStrategy"/>
</bean>
<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
<bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
<property name="attributeSource" ref="attributeSource"/>
</bean>
<bean id="attributeSource"
class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
</beans>objectName が ManagedResource 属性に提供されていない場合、ObjectName は次の形式で作成されます: [ 完全修飾パッケージ名 ]:type = [short-classname]、name = [bean-name] 例: 次の Bean に対して生成される ObjectName は com.example:type=MyClass,name=myBean になります。
<bean id="myBean" class="com.example.MyClass"/>アノテーションベースの MBean エクスポートの構成
管理インターフェースを定義するためにアノテーションベースのアプローチを使用する場合は、MBeanExporter の便利なサブクラスである AnnotationMBeanExporter を使用できます。このサブクラスのインスタンスを定義する場合、標準の Java アノテーションベースのメタデータが常に使用されるため (自動検出も常に有効)、namingStrategy、assembler、attributeSource 構成は不要になります。実際、MBeanExporter Bean を定義するのではなく、次の例に示すように、@EnableMBeanExport @Configuration アノテーションまたは <context:mbean-export/> 要素によってさらに単純な構文がサポートされています。
Java
Kotlin
XML
@Configuration
@EnableMBeanExport
public class JmxConfiguration {
}@Configuration
@EnableMBeanExport
class JmxConfiguration<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:mbean-export/>
</beans> 必要に応じて、特定の MBean server への参照を提供できます。defaultDomain 属性(AnnotationMBeanExporter のプロパティ)は、生成された MBean ObjectName ドメインの代替値を受け入れます。これは、次の例に示すように、前の MetadataNamingStrategy セクションで説明したように、完全修飾パッケージ名の代わりに使用されます。
Java
Kotlin
XML
@Configuration
@EnableMBeanExport(server="myMBeanServer", defaultDomain="myDomain")
public class CustomJmxConfiguration {
}@Configuration
@EnableMBeanExport(server="myMBeanServer", defaultDomain="myDomain")
class CustomJmxConfiguration<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>
</beans>Bean クラスで JMX アノテーションの自動検出と組み合わせてインターフェースベースの AOP プロキシを使用しないでください。インターフェースベースのプロキシは、ターゲットクラスを「非表示」にします。これにより、JMX 管理のリソースアノテーションも非表示になります。その場合はターゲットクラスプロキシを使用する必要があります(<aop:config/>、<tx:annotation-driven/> などで "proxy-target-class" フラグを設定することにより)。そうしないと、JMXBean が起動時にサイレントに無視される可能性があります。 |