2016-09-14 21 views
2

我對Spring非常陌生,甚至更多 - 所以對於Spring Integration來說,如果這是一個非常基本的問題,請道歉。什麼是簡單文件複製的適當Java配置

我想構建一個非常基本的日誌文件處理器來學習繩索。非常類似於:example

我也想使用java配置方法,並且我一直遵循的大多數示例都是由XML驅動的,而且我很難進行翻譯。

最終,我想循環查詢日誌文件的源目錄並使用持久性存儲來跟蹤發現的內容。

然後,將要處理的文件複製到處理文件夾,然後啓動彈簧批處理作業來處理文件的內容。

當一切都完成時,處理的文件可以從處理位置刪除。

我似乎無法找出正確的方法來連接(使用SpEL的通用java配置)流。另外,我仍然不確定合適的作品應該是什麼。

同樣的東西沿着這些基本的高層次線路的文件移動:

file:inbound-channel-adapter -> channel -> file:outbound-adapter 

basic sample

這裏是我迄今爲止

編輯

我已經用Artem的解決方案進行了更新。我的源文件現在已正確複製到目標位置。謝謝Artem!

最終我仍然面臨同樣的問題。要被掃描的文件被立即找到(並且立即填充metadata-store.properties文件),但文件被緩慢地複製到目標文件夾。如果發生崩潰,任何尚未複製到目標文件夾的源文件將基本上「丟失」。也許我需要查看其他形式的持久性存儲,如自定義的jdbcfilter。

@Value("${logProcessor.filenamePattern}") 
private String filenamePattern; 

@Value("${logProcessor.sourceDirectory}") 
private String sourceDirectory; 

@Value("${logProcessor.processingDirectory}") 
private String processingDirectory; 

@Bean 
@InboundChannelAdapter(channel = "sourceFileChannel", poller = @Poller(fixedRate = "5000")) 
public MessageSource<File> sourceFiles() { 

     CompositeFileListFilter<File> filters = new CompositeFileListFilter<>(); 
     filters.addFilter(new SimplePatternFileListFilter(filenamePattern)); 
     filters.addFilter(persistentFilter()); 

     FileReadingMessageSource source = new FileReadingMessageSource(); 
     source.setAutoCreateDirectory(true); 
     source.setDirectory(new File(sourceDirectory)); 
     source.setFilter(filters); 
     source.setUseWatchService(true); 

     return source; 
    } 

@Bean 
@InboundChannelAdapter(channel = "processingFileChannel", poller = @Poller(fixedRate = "5000")) 
    public MessageSource<File> processingFiles() { 

     CompositeFileListFilter<File> filters = new CompositeFileListFilter<>(); 
     filters.addFilter(new SimplePatternFileListFilter(filenamePattern)); 

     FileReadingMessageSource source = new FileReadingMessageSource(); 
     source.setAutoCreateDirectory(true); 
     source.setDirectory(new File(processingDirectory)); 
     source.setFilter(filters); 

     return source; 
    } 

@Bean 
@ServiceActivator(inputChannel = "sourceFileChannel") 
public MessageHandler fileOutboundChannelAdapter() { 
    FileWritingMessageHandler adapter = new FileWritingMessageHandler(new File(processingDirectory)); 
    adapter.setDeleteSourceFiles(false); 
    adapter.setAutoCreateDirectory(true); 
    adapter.setExpectReply(false); 
    return adapter; 
} 


    @Bean 
    public MessageChannel sourceFileChannel() { 
     return new DirectChannel(); 
    } 

    @Bean 
    public MessageChannel processingFileChannel() { 
     return new DirectChannel(); 
    } 

    @Bean 
    public DefaultDirectoryScanner defaultDirectoryScanner() { 
     return new DefaultDirectoryScanner(); 
    } 

    @Bean 
    public FileSystemPersistentAcceptOnceFileListFilter persistentFilter() { 
     FileSystemPersistentAcceptOnceFileListFilter fileSystemPersistentAcceptOnceFileListFilter = new FileSystemPersistentAcceptOnceFileListFilter(metadataStore(), ""); 
     fileSystemPersistentAcceptOnceFileListFilter.setFlushOnUpdate(true); 
     return fileSystemPersistentAcceptOnceFileListFilter; 
    } 

    @Bean 
    public PropertiesPersistingMetadataStore metadataStore(){ 
     PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore(); 
     metadataStore.setBaseDirectory("C:\\root\\code\\logProcessor"); 
     return metadataStore; 
    } 

回答

1

您的配置目前爲止還不錯。

有這樣一個複雜的任務,我不知道如何幫助你。

你應該問更具體的問題。我們無法爲您寫出解決方案。

不確定爲什麼你需要將文件從一個目錄複製到另一個目錄,如果你只需從源目錄輪詢它們,存儲在metadataStore並開始文件處理。

所以,我在你的配置中看到一個小問題。 FileWritingMessageHandler將結果發送到processingFileChannel,第二個FileReadingMessageSource完成相同的操作。我不確定這是你的意圖。以防萬一,以引起您的注意。

您可能還需要了解關於FileSplitter,它可讓您逐行處理文件。

你也說processingDirectory,但你使用tmpDirFileWritingMessageHandler,我猜,這是假設你的複製邏輯。

讓我們一步步完成任務吧!然後你弄清楚什麼,在哪裏以及如何使用!

編輯

如果你只需要複製文件到processingDirectory沒有任何答覆,你應該做單向適配器:

@Bean 
@ServiceActivator(inputChannel = "sourceFileChannel") 
public MessageHandler fileOutboundChannelAdapter() { 
    FileWritingMessageHandler adapter = new FileWritingMessageHandler(new File(processingDirectory)); 
    adapter.setDeleteSourceFiles(true); 
    adapter.setAutoCreateDirectory(true); 
    adapter.setExpectReply(false); 
    return adapter; 
} 

然後你@InboundChannelAdapter(channel = "processingFileChannel"好拿起文件進行處理。

不確定你需要DeleteSourceFiles雖然...

+0

謝謝你的迴應Artem。文件複製的原因是爲了避免文件已被找到但尚未處理的問題,類似於[thread](http://stackoverflow.com/questions/25756387/prevent-duplicates-across-restarts在春天集成)我會更新我的答案是更具體的,我只是混淆如何使用出站適配器。 – rcurrie

+0

請在我的答案中找到編輯。 –

+0

謝謝阿爾喬姆,這非常棒。我同意,源文件可以保留,因此adapter.setDeleteSourceFiles(false);我會將此標記爲答案,謝謝!我應該開一個新的問題,因爲我仍然面臨同樣的問題。 metadata-store.properties文件立即列出所有找到的文件,但這些文件緩慢複製到目標文件夾。因此,如果發生崩潰,仍然會有未處理的文件。這是我最終想要解決的問題。 – rcurrie

相關問題