15

Spring 3 でプロパティ ファイルを使用しています。Spring がそのコンテキストを初期化すると、プロパティ ファイルがロードされ、@Value アノテーションを使用してすべての Bean に配置されます。

ファイル内のいくつかのプロパティを更新し、新しいプロパティを Spring にリロードするサーバー上の JMX を公開する可能性が必要です。サーバーを再起動したり、そのコンテキストをリロードしたりする必要はありません。

Spring メソッドを使用してプロパティをリロードし、それらをすべての Bean に設定することでこれを実装できますか、それとも自分でこのようなものを作成する必要がありますか?

4

6 に答える 6

10

Apache Commons Configurationプロジェクトのjava.util.Propertiesaに置き換えることをお勧めします。ファイルがいつ変更されたかを検出するか、JMX を介してトリガーすることにより、自動リロードをサポートします。PropertiesConfiguration

于 2012-11-06T09:43:13.740 に答える
5

一般的な方法はないと思います。最も「クリーン」な方法は、Spring コンテキストをシャットダウンして、最初から構築することです。たとえば、DBCP 接続プールを使用し、そのデータベース接続 URL を更新することを検討してください。つまり、プールを適切にシャットダウンしてから、新しいオブジェクトを作成し、プールへのすべての参照も更新する必要があります。現在、一部の Bean はそのプールから接続を取得する可能性があり、プール構成を更新すると、何らかの方法で接続を再要求する必要があることを意味します。したがって、Bean はそれを行う方法を知る必要がある場合がありますが、これは一般的ではありません。

構成イベントと更新イベントを使用して別の Bean を作成し、その Bean を、構成の変更について知る必要があるすべての Bean の依存関係として配置することをお勧めします。次に、Apache Commons Configuration を使用して、ファイルの変更を監視し、構成の更新を伝達することができます。

おそらく、JMS を使用するのが良いでしょう (後でアプリを配布する場合)。

于 2012-11-06T09:52:39.417 に答える
2

はい、SpringJMXの方法でこれを行うことができます。これらのBeanをSpring構成ファイルに追加します。プロパティファイルを読み取るための別のメソッドを作成します。このサンプルでは、​​callThisAgain()メソッドを使用します。

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
        <map>
            <entry key="your.package.bean:name=sampleBeanService" value-ref="sampleService"/>
        </map>
    </property>
    <property name="assembler">
        <bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">
            <property name="managedMethods">
                <value>
                    callThisAgain <!--Simply declare the method name here (only the name) -->
                </value>
            </property>
        </bean>
    </property>
</bean>

<bean class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry">
    <property name="objectName" value="connector:name=rmi"/>
    <property name="serviceUrl" value="service:jmx:rmi://127.0.0.1/jndi/rmi://127.0.0.1:11000/sample"/>
</bean>

<bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
    <property name="port" value="11000"/>
</bean>

その後、jconsoleを使用して、サーバーを再起動せずにメソッドをリロードできます。

于 2012-11-07T08:21:51.177 に答える