4

5 つ以上の Spring Web アプリケーションがあり、それらすべてが別の共通ライブラリを利用しています。この共通ライブラリには、独自の MBean があります。必須の一意の objectName 制約により、アプリケーションを同じサーバーにデプロイできませんでした。

私が MBean を使用している方法は次のとおりです。

@ManagedResource(objectName = "com.org.city:name=City", description = "City related operations")

すべてのアプリケーションで異なる objectNames を持つ同じ MBean クラスを使用したいと考えています。MBean を複製せずにそれを利用する正しい方法は何ですか?

ありがとう

4

5 に答える 5

5

私は同じ問題に遭遇し、Cemo's solutionから構築しました。これがサンプル実装です。

context.xml

<!-- Set up jmx bean auto scanning -->
<!-- Note: we're not using <context:mbean-export /> because we need to provide our own naming strategy -->
<bean id="mbeanExporter" class="org.springframework.jmx.export.annotation.AnnotationMBeanExporter">
    <property name="namingStrategy">
        <bean class="com.foo.MultiAppMetadataNamingStrategy">
            <property name="applicationName" value="${application.name}" />
        </bean>
    </property>
</bean>

MultiAppMetadataNamingStrategy.java

public class MultiAppMetadataNamingStrategy implements ObjectNamingStrategy, InitializingBean {

    private String applicationName;

    public MultiAppMetadataNamingStrategy() {
    }

    public MultiAppMetadataNamingStrategy(String applicationName) {
        this.applicationName = Preconditions.checkNotNull(applicationName, "applicationName must not be null");
    }

    public void setApplicationName(String applicationName) {
        this.applicationName = Preconditions.checkNotNull(applicationName, "applicationName must not be null");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        if (applicationName == null) {
            throw new IllegalArgumentException("Property 'applicationName' is required");
        }
    }

    @Override
    public ObjectName getObjectName(Object managedBean, String beanKey) throws MalformedObjectNameException {
        Class managedClass = AopUtils.getTargetClass(managedBean);
        String domain = ClassUtils.getPackageName(managedClass);

        Hashtable<String, String> properties = new Hashtable<>();
        properties.put("type", ClassUtils.getShortName(managedClass));
        properties.put("name", beanKey);
        // ensure the application name is included as a property in the object name
        properties.put("app", applicationName);
        return ObjectNameManager.getInstance(domain, properties);
    }
}

これにより、次のような mbean を設定できます。

package com.foo;

@ManagedResource(description = "Bean description")
public class MyBean {
    ...
}

オブジェクト名でMBeanを登録しますcom.foo:name=myBean,type=MyBean,app=CustomAppName

于 2013-10-18T16:53:05.300 に答える
4

カスタム動作のために ObjectNamingStrategy を実装しました。

   @Override
  public ObjectName getObjectName(Object managedBean, String beanKey) throws MalformedObjectNameException {
     Class managedClass = AopUtils.getTargetClass(managedBean);
     Hashtable<String, String> properties = new Hashtable<String, String>();
     properties.put("type",ClassUtils.getPackageName(managedClass).concat(".").concat(ClassUtils.getShortName(managedClass)));
     properties.put("name", beanKey);
     return ObjectNameManager.getInstance(domain, properties);
  }
于 2011-08-18T08:14:51.980 に答える
0

プレースホルダーを使用して、プロパティに基づいた簡単な命名戦略を定義できます。
すべての戦争には、app.properties の独自のコピーがあります

プロパティ ファイルを使用:app.properties

appName=MyApp1 #Every app will have it own value e.g,MyApp2,MyApp3,MyApp4,MyApp5

および PropertiesPlaceHolder

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="placeholderPrefix" value="$app{" />    
     <property name="location" value="classpath:app.properties"/>
</bean>

objectName の定義

@ManagedResource(objectName=com.mycompany:name=$app{appName}-MyBean")
public class MyBean {}

あなたの豆は名前が付けられます

com.mycompany
    +MyApp1-MyBean
    +MyApp2-MyBean
    +MyApp3-MyBean
    +MyApp4-MyBean
    +MyApp5-MyBean

1 つのプロパティ プレース ホルダーを複数使用できます。
Spring 4.0.2 で動作

于 2016-04-06T08:07:43.600 に答える
0

mbean エクスポーターの登録動作を変更する必要があります。

<property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING"/>

ただし、これは 1 つのアプリケーションのみが Bean を登録することを意味します。また、論理的に、複数のアプリケーションから同じ名前の mbean を複数持つことはできません。呼び出すアプリケーションはどのように決定されますか? アプリケーション名を mbean 名のプレフィックスとして使用します。

于 2011-08-16T07:52:13.347 に答える