我對Spring非常陌生,甚至更多 - 所以對於Spring Integration來說,如果這是一個非常基本的問題,請道歉。什麼是簡單文件複製的適當Java配置
我想構建一個非常基本的日誌文件處理器來學習繩索。非常類似於:example
我也想使用java配置方法,並且我一直遵循的大多數示例都是由XML驅動的,而且我很難進行翻譯。
最終,我想循環查詢日誌文件的源目錄並使用持久性存儲來跟蹤發現的內容。
然後,將要處理的文件複製到處理文件夾,然後啓動彈簧批處理作業來處理文件的內容。
當一切都完成時,處理的文件可以從處理位置刪除。
我似乎無法找出正確的方法來連接(使用SpEL的通用java配置)流。另外,我仍然不確定合適的作品應該是什麼。
同樣的東西沿着這些基本的高層次線路的文件移動:
file:inbound-channel-adapter -> channel -> file:outbound-adapter
這裏是我迄今爲止
編輯
我已經用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;
}
謝謝你的迴應Artem。文件複製的原因是爲了避免文件已被找到但尚未處理的問題,類似於[thread](http://stackoverflow.com/questions/25756387/prevent-duplicates-across-restarts在春天集成)我會更新我的答案是更具體的,我只是混淆如何使用出站適配器。 – rcurrie
請在我的答案中找到編輯。 –
謝謝阿爾喬姆,這非常棒。我同意,源文件可以保留,因此adapter.setDeleteSourceFiles(false);我會將此標記爲答案,謝謝!我應該開一個新的問題,因爲我仍然面臨同樣的問題。 metadata-store.properties文件立即列出所有找到的文件,但這些文件緩慢複製到目標文件夾。因此,如果發生崩潰,仍然會有未處理的文件。這是我最終想要解決的問題。 – rcurrie