我对 Spring 非常陌生,对 Spring Integration 更陌生,所以如果这是一个非常基本的问题,我深表歉意。
我想构建一个非常基本的日志文件处理器来学习诀窍。与此非常相似:example http://forum.spring.io/forum/spring-projects/integration/94764-file-channel-adapter-issues
我还想使用 java 配置方法,并且我所遵循的大多数示例都是 XML 驱动的,并且我在进行翻译时遇到了困难。
最终,我想递归地轮询日志文件的源目录,并使用持久性存储来跟踪发现的内容。
然后,将要处理的文件复制到处理文件夹中,然后启动 Spring 批处理作业来处理文件的内容。
当一切完成后,可以从处理位置删除已处理的文件。
我似乎无法找出连接流程的正确方法(使用 SpEL 的通用 java 配置)。另外,我仍然非常不确定正确的部分应该是什么。
再次遵循这些基本的、高级的文件移动路线:
file:inbound-channel-adapter -> channel -> file:outbound-adapter
基本样本 https://github.com/spring-projects/spring-integration-samples/tree/master/basic/file
这是我到目前为止所拥有的
EDIT
我已经更新了 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;
}