0

背景: Muleを使用して、複数のMuleインスタンスに多数のWebサービスをデプロイしています。Springを使用してサービスを構成していますが、これはすべて、ファイルシステムのプロパティファイルの構成でうまく機能しています。このようなセットアップの管理を容易にするために、ファイルシステム上の最小限のブートストラップ情報のみを保持して、すべての構成をWebサービスに移動したいと思います。

このブート情報は、次の2つの部分で構成されています。

1)構成サービスのURI-これはシステムプロパティとしてMuleに渡され、正しく取得されます

2)構成レルム-サービスのインスタンスが構成サービスに対して自身を識別できるようにする追加の識別子(たとえば、サーバーdev-2で実行されているカタログサービスのインスタンス)。各構成サービスが特定のサービス(カタログサービスなど)の複数のインスタンスに構成情報を提供している可能性があるため、この部分をSpring構成にコーディングすることはできません(たとえば、configRealmをcatalogue-serviceに設定することによって)。

試みられた解決策:

1)単一のオーバーライドされたPropertyPlaceholderConfigurer(私は知っています、私は知っています)内にエンコードされていることを決定するためのすべてのロジックを備えています

2)順序が異なる複数のPropertyPlaceholderConfigurer(1つはファイルシステムプロパティを処理し、もう1つはWebサービスプロパティを処理します)

3)Orderを実装するカスタムBeanFactoryPostProcessor

4)WebServicePropertySourceを@Configurationとして定義し、@ PropertySourceを使用して外部ファイルを明示的に参照しました(プレースホルダーを解決するためにWebServicePropertySourceが必要な時点で環境が初期化されていないため失敗しました)

5)Webサービスプロパティを処理するカスタムPropertySourceとファイルシステムプロパティを処理するRespourcePropertySourcesを備えた単一のPropertySourcesPlaceholderConfigurer

これらのアプローチ(4つを除く)はすべて、PropertySourcesPlaceholderConfigurer / PropertyPlaceholderConfigurerの定義でプレースホルダーを使用しているという事実に基づいています-プレースホルダーは解決されず、Webサービスに渡されるレルムは$ {catalogue- service-realm}または同様のもの。

システムプロパティを使用して構成レルムを定義することでこれを機能させることができますが、Muleインスタンスにデプロイされたサービスがかなりある可能性があるため、これは見苦しく、変更を加えるにはサーバーを再起動する必要があります。

以下のコードでは、最新のSpring 3.1 APIを使用しているため、例を最新のソリューション(上記の5)に限定します。

mule-config.xmlからの抜粋:

   <spring:bean id="configServiceHelper" class="config.client.GetConfigurationServiceHelper">
        <spring:property name="configRealm" value="${catalogue-service-realm}"/>
        <spring:property name="configServiceWsdlUrl" value="${configuration.service.url}"/>
    </spring:bean>

    <spring:bean id="webServicePropertySource" class="config.client.WebServicePropertySource">
        <spring:constructor-arg name="name" value="web-service-property-source"/>
        <spring:constructor-arg name="helper" ref="configServiceHelper"/>
    </spring:bean>

    <spring:bean id="propertySources" class="config.client.DefaultPropertySources">
        <spring:property name="propertySources">
            <spring:list>
                <spring:ref bean="webServicePropertySource"/>
            </spring:list>
        </spring:property>
    </spring:bean>

    <spring:bean class="config.client.LocationPropertySourcesPlaceholderConfigurer">
        <spring:property name="propertySources" ref="propertySources"/>
        <spring:property name="locations">
            <spring:list>
                <spring:value>classpath*:spring/config/*.properties</spring:value>
                <spring:value>classpath:catalogue-service.properties</spring:value>
                <spring:value>classpath:catalogue-service-override.properties</spring:value>
            </spring:list>
        </spring:property>
    </spring:bean>

注意: config.client.LocationPropertySourcesPlaceholderConfigurerの動作は、propertySourcesが設定されている場合に場所を破棄する代わりに、それらをpropertySourcesに追加するという点で、デフォルトのPropertySourcesPLaceholderConfigurerとは異なります。ロギングにより、propertySourcesのリストが実行時に14個の要素で構成されていることが確認されました(Webサービスのプロパティソースと13個のリソース)

この抜粋は、私がやろうとしていることを簡潔に示していると確信していますが、そうでない場合は、詳細をお尋ねください。私の問題の核心は、Webサービスヘルパーの$ {catalogue-service-realm}プレースホルダーが、クラスパスのプロパティファイルに保持されている情報から解決されないことです。

これは私には鶏が先か卵が先かという問題のように見えますが、簡単な解決策も必要です-それが何であるかわからないので、助けやポインタをいただければ幸いです:-)

よろしく、マット

4

3 に答える 3

0

Springプロファイルの使用を検討しましたか?

ラバでそれらを活用する方法についての簡単な例をここで見つけることができます

于 2013-03-06T11:31:47.573 に答える
0

Java構成APIは、マルチテナント構成をサポートします。

Springと統合するには、ここに掲載されているいくつかのソリューションを使用するか、SpELを活用することができます@Property("expression")

于 2013-03-06T15:46:08.050 に答える
0

私の問題の核心は、PropertySourcesPlaceholderConfigurerBean定義のプレースホルダーが解決されていないことです。

問題のあるconfigRealm属性定義のプレースホルダーを明示的かつ手動で解決することで、これを回避しました。正確にはエレガントではありませんが、上記のVictorRomeroによって提案された追加の構成ライブラリを使用する必要はありません。

以下の注釈付きSpring構成。

<!-- configRealm moved to webServicePropertySource to prevent 
     the need to pollute service client with Spring PropertyResolver -->
    <spring:bean id="configServiceHelper" class="config.client.GetConfigurationServiceHelper">
        <spring:property name="configServiceWsdlUrl" value="${configuration.service.url}"/>
    </spring:bean>

<!-- WebServicePropertySource now contains configRealm and a PropertyResolver to use
     to resolve the placeholder -->
    <spring:bean id="webServicePropertySource" class="config.client.WebServicePropertySource">
        <spring:constructor-arg name="name" value="web-service-property-source"/>
        <spring:constructor-arg name="helper" ref="configServiceHelper"/>
        <spring:constructor-arg name="realm" value="${bisac_genre_service.config_realm}"/>
        <spring:constructor-arg name="resolver" ref="propertyResolver"/>
    </spring:bean>

<!-- New class to wrap a bunch of resources into a PropertySource -->
    <spring:bean id="resourcePropertySource" class="config.client.ResourceAggregationPropertySource">
        <spring:constructor-arg name="name" value="resource-property-source"/>
        <spring:constructor-arg name="resources">
            <spring:list>
                <spring:value>classpath*:spring/config/*.properties</spring:value>
                <spring:value>classpath:genre-service.properties</spring:value>
                <spring:value>classpath:genre-service-override.properties</spring:value>
            </spring:list>
        </spring:constructor-arg>
    </spring:bean>

<!-- Standard PropertySourcesPropertyResolver defined to just use the 
     classpath resources for resolution -->
    <spring:bean id="propertyResolver" class="org.springframework.core.env.PropertySourcesPropertyResolver">
        <spring:constructor-arg ref="resourcePropertySources"/>
    </spring:bean>

<!-- PropertySources consisting of just the filesystem resources -->
    <spring:bean id="resourcePropertySources" class="config.client.DefaultPropertySources">
        <spring:property name="propertySources">
            <spring:list>
                <spring:ref bean="resourcePropertySource"/>
            </spring:list>
        </spring:property>
    </spring:bean>

<!-- PropertySources consisting of the web service source plus
     the filesystem resources -->
    <spring:bean id="allPropertySources" class="config.client.DefaultPropertySources">
        <spring:property name="propertySources">
            <spring:list>
                <spring:ref bean="resourcePropertySource"/>
                <spring:ref bean="webServicePropertySource"/>
            </spring:list>
        </spring:property>
    </spring:bean>

<!-- Vanilla Spring PropertySourcesPlaceholderConfigurer using ALL PropertySources -->
    <spring:bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <spring:property name="propertySources" ref="allPropertySources"/>
    </spring:bean>
于 2013-03-07T15:55:21.007 に答える