背景: 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}プレースホルダーが、クラスパスのプロパティファイルに保持されている情報から解決されないことです。
これは私には鶏が先か卵が先かという問題のように見えますが、簡単な解決策も必要です-それが何であるかわからないので、助けやポインタをいただければ幸いです:-)
よろしく、マット