2014-10-20 60 views
1

我有一個工作應用程序,它從屬性文件中指定的目錄中讀取並寫入其他目錄。以下是用於讀取和寫入的入站和出站通道適配器。更改出站通道適配器上的目錄

<file:inbound-channel-adapter id="inputFileChannelAdapter" channel="fileIn" directory="${dir.monitor}" 
    auto-startup="false" prevent-duplicates="false" filename-pattern="*.done" > 
    <int:poller id="inputFilePoller" time-unit="SECONDS" fixed-delay="1" max-messages-per-poll="100" /> 
</file:inbound-channel-adapter> 


<int:channel id="finishedFileChannel"/> 
<file:outbound-channel-adapter id="finishedDataFiles" delete-source-files="true" auto-create-directory="false" 
    directory="${dir.finished}" channel="finishedFileChannel" /> 

我有一個需要允許在應用程序運行時更改目錄。我創建了讓我用下面的代碼停止輪詢服務和改變輸入目錄控制總線:

SourcePollingChannelAdapter adapter = context.getBean("inputFileChannelAdapter", SourcePollingChannelAdapter.class); 
    FileReadingMessageSource source = context.getBean("inputFileChannelAdapter.source", FileReadingMessageSource.class); 
    File monitorFileDir = new File("C:\newInput"); 
    source.setDirectory(monitorFileDir); 

不過,我不知道如何來完成相同的出站通道適配器。我試圖得到參考了約束channnel適配器,然後創建一個新的EventDivenConsumer和FileWritingMessageHandler和重新分配的參考,但它沒有工作,我覺得我標題下與解決方案在錯誤的道路。任何建議,將不勝感激。

回答

0

對於FileReadingMessageSource你是否正確。

對於FileWritingMessageHandler你不能那樣做,因爲directory轉換爲private final Expression destinationDirectoryExpression;

所以,這是一個提示,我們如何能夠克服自己的change dir a runtime用例:

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

<file:outbound-channel-adapter directory-expression="@targetDir.get()"/> 

有,你總是可以在運行時從ApplicationContext retrive這個bean並更改值目標目錄:

AtomicReference<String> targetDir = (AtomicReference<String>) context.getBean("targetDir", AtomicReference.class); 
targetDir.set("/new/target/dir"); 
+0

非常感謝阿爾喬姆,即工作!我很欣賞所有的細節。 – golfnguitarz 2014-10-20 17:39:16

+0

我不得不使用遠程目錄的表情,目錄表達不承認(我的版本的春天?) 偉大的作品,否則 – BenoitParis 2015-07-16 10:28:52

+0

'遠程目錄expression'?因此,對於SFTP使用''或類似命令。 – 2015-07-16 12:26:06

0

,如果你想它的基礎上的信息,您可以使用directory-expression="@someBean.whereTo()""@someBean.whereTo(#root)"

使用較新版本的框架,您可以獲得對bean名稱爲finishedDataFiles.handler的處理程序的引用,但正如@Artem所說,目錄是final

相關問題