1

私はSpringが初めてで、Citrus Frameworkを使用しています。inbound-channel-adapter destination変数を動的に変更してみます。この変数はプロパティ ファイルにあり、常に変更されます。

現在、私はを使用してAtomicReferenceおり、その値をJavaコードで変更しています

context.xml

    <bean id="targetDir" class="java.util.concurrent.atomic.AtomicReference">
        <constructor-arg value="${output.path.temp}"/>
    </bean>

    <file:inbound-channel-adapter id="fileInboundAdapter" auto-create-directory="false"
        channel="fileChannel" directory="file:@targetDir.get()" auto-startup="false"
        filename-pattern="*.xml">
        <si:poller cron="0 * * * * ?"/>
    </file:inbound-channel-adapter>

そしてJavaファイルで:

SourcePollingChannelAdapter fileInboundAdapter = (SourcePollingChannelAdapter)context.getApplicationContext().getBean("fileInboundAdapter");
if (fileInboundAdapter.isRunning()) {
    fileInboundAdapter.stop();

    @SuppressWarnings("unchecked")
    AtomicReference<String> targetDir = (AtomicReference<String>)     
    context.getApplicationContext().getBean("targetDir", AtomicReference.class);
    targetDir.set(strOutPath[0]+"/"+strOutPath[1]+"/"+strOutPath[2]+"/"+strOutPath[3]+"/"); 
    fileInboundAdapter.start();
}

この解決策は機能しません...誰かが解決策を持っていますか?

どうもありがとう。

4

1 に答える 1

2

それは本当だ。あなたAtomicReferenceはターゲットに影響を与えないからdirectoryです。

これを行いますdirectory="file:@targetDir.get()"。これはオブジェクトStringに変換しようとするため、まったく正しくありません。Fileここで SpEL を使用する場合は、次のようにする必要があります。

directory="#{targetDir.get()}"

file:プレフィックスなし。

とにかく、SpEL は applicationContext strtup で 1 回しか評価されないため、役に立ちません。

directory実行時に変更するのでFileReadingMessageSource.setDirectory、サービスから使用する必要があります。このようなもの:

SourcePollingChannelAdapter fileInboundAdapter = (SourcePollingChannelAdapter)context.getApplicationContext().getBean("fileInboundAdapter");
if (fileInboundAdapter.isRunning())
    fileInboundAdapter.stop();

    FileReadingMessageSource source = (FileReadingMessageSource) context.getApplicationContext().getBean("fileInboundAdapter.source");    
    source.setDirectory(new File(strOutPath[0]+"/"+strOutPath[1]+"/"+strOutPath[2]+"/"+strOutPath[3]+"/")); 
    fileInboundAdapter.start();
}

そして、それを取り除きAtomicReferenceます。

最初から、属性の property-placeholder をdirectory直接使用できます。

于 2015-02-10T10:08:28.067 に答える