我对Spring非常陌生,对Spring Integration来说更是如此,如果这是一个非常基本的问题,请道歉。
我想构建一个非常基本的日志文件处理器来学习绳索。与此非常相似:example
我也想使用java配置方法,我所关注的大部分示例都是XML驱动的,而且我很难进行翻译。
最终,我希望以递归方式轮询源目录以查找日志文件,并使用持久性存储来跟踪已找到的内容。
然后,将要处理的文件复制到处理文件夹,然后启动弹出批处理作业以处理文件的内容。
当一切都完成后,可以从处理位置删除已处理的文件。
我似乎无法找到正确的方法来连接(使用SpEL的常规java配置)流程。此外,我仍然不确定应该是什么样的东西。
这些文件移动的基本高级线路再次出现:
file:inbound-channel-adapter -> channel -> file:outbound-adapter
这是我到目前为止所拥有的
修改
我已使用Artem的解决方案进行了更新。我的源文件现在已正确复制到目标位置。谢谢Artem!
最终我仍面临同样的问题。立即找到要扫描的文件(并立即填充metadata-store.properties文件),但文件会慢慢复制到目标文件夹。如果发生崩溃,任何尚未复制到目标文件夹的源文件将基本上“丢失”#34;。也许我需要查看其他形式的持久性存储,例如自定义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;
}
答案 0 :(得分:1)
到目前为止你的配置还不错。
执行如此复杂的任务,我不确定如何帮助你。
你应该问更具体的问题。我们无法为您编写解决方案。
不确定为什么需要将文件从一个目录复制到另一个目录,如果您只需从源目录中轮询它们,存储在metadataStore
中并开始文件处理。
所以,我发现配置中存在一个小问题。 FileWritingMessageHandler
将结果发送到processingFileChannel
,同样由第二个FileReadingMessageSource
完成。我不确定这是你的意图。以防万一你注意。
您可能还需要了解FileSplitter
,它可让您逐行处理文件。
你也说processingDirectory
,但是你使用tmpDir
作为FileWritingMessageHandler
,我想这是假设您的复制逻辑。
让我们一步一步完成任务!然后你弄明白了什么,在哪里以及如何使用!
修改强>
如果你只是需要将文件复制到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
但是......