如何使用来自 Spring Integration 的 File Watcher 仅用于等待,而不是用于移动?
How to use File Watcher from Spring Integration only for Waiting, NOT for Moving?
我正在学习 Spring 在 Spring 启动应用程序中的集成,我需要制作一个应用程序来等待文件夹中的 .txt 文件,然后进行一些处理,并且然后将生成的 .txt 文件放在另一个文件夹中。
所以应用程序应该等待输入文件夹中的 inputxxx.txt 个文件,然后进行一些处理,然后将生成的 outputxxx.txt 个文件放入输出文件夹中。 inputxxx.txt 文件应保留在输入文件夹中,输出文件夹中应只有 outputxxx.txt 文件。
@Configuration
@EnableIntegration
public class ApplicationConfig {
@Bean
public MessageChannel fileChannel() {
return new DirectChannel();
}
@Bean
@InboundChannelAdapter(value = "fileChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource<File> fileReadingMessageSource() {
SimplePatternFileListFilter filter = new SimplePatternFileListFilter(FILE_PATTERN);
return new FilePoller(directory, filter);
}
@Bean
@ServiceActivator(inputChannel = "fileChannel")
public MessageHandler fileWritingMessageHandler() {
return new FileHandler(OUTPUT_LOCATION);
}
}
FilePoller class:
public class FilePoller extends FileReadingMessageSource {
public FilePoller(File directory, FileListFilter<File> filter) {
super.setDirectory(directory);
super.setFilter(filter);
}
}
所以我不想使用 move()
方法,因为 JAXB 会做我想做的,但是如果我删除 move()
我的应用程序不会停止。
谢谢!我们将不胜感激任何反馈!
您的问题在这里:
SimplePatternFileListFilter filter = new SimplePatternFileListFilter(FILE_PATTERN);
return new FilePoller(directory, filter);
您只需检查特定的文件类型,但不会保护您的程序在下一个轮询周期中选取相同的文件。
请考虑使用 ChainFileListFilter
,其中第一个是第一个,但第二个必须是 AcceptOnceFileListFilter
。
这样您就可以完全忽略原始文件而只专注于您的输出文件。
下一个轮询周期不会再次选取原始文件。
对于程序重新启动之间的永久无知,您应该考虑使用 FileSystemPersistentAcceptOnceFileListFilter
。
在文档中查看更多信息:
https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#file-reading
我正在学习 Spring 在 Spring 启动应用程序中的集成,我需要制作一个应用程序来等待文件夹中的 .txt 文件,然后进行一些处理,并且然后将生成的 .txt 文件放在另一个文件夹中。
所以应用程序应该等待输入文件夹中的 inputxxx.txt 个文件,然后进行一些处理,然后将生成的 outputxxx.txt 个文件放入输出文件夹中。 inputxxx.txt 文件应保留在输入文件夹中,输出文件夹中应只有 outputxxx.txt 文件。
@Configuration
@EnableIntegration
public class ApplicationConfig {
@Bean
public MessageChannel fileChannel() {
return new DirectChannel();
}
@Bean
@InboundChannelAdapter(value = "fileChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource<File> fileReadingMessageSource() {
SimplePatternFileListFilter filter = new SimplePatternFileListFilter(FILE_PATTERN);
return new FilePoller(directory, filter);
}
@Bean
@ServiceActivator(inputChannel = "fileChannel")
public MessageHandler fileWritingMessageHandler() {
return new FileHandler(OUTPUT_LOCATION);
}
}
FilePoller class:
public class FilePoller extends FileReadingMessageSource {
public FilePoller(File directory, FileListFilter<File> filter) {
super.setDirectory(directory);
super.setFilter(filter);
}
}
所以我不想使用 move()
方法,因为 JAXB 会做我想做的,但是如果我删除 move()
我的应用程序不会停止。
谢谢!我们将不胜感激任何反馈!
您的问题在这里:
SimplePatternFileListFilter filter = new SimplePatternFileListFilter(FILE_PATTERN);
return new FilePoller(directory, filter);
您只需检查特定的文件类型,但不会保护您的程序在下一个轮询周期中选取相同的文件。
请考虑使用 ChainFileListFilter
,其中第一个是第一个,但第二个必须是 AcceptOnceFileListFilter
。
这样您就可以完全忽略原始文件而只专注于您的输出文件。 下一个轮询周期不会再次选取原始文件。
对于程序重新启动之间的永久无知,您应该考虑使用 FileSystemPersistentAcceptOnceFileListFilter
。
在文档中查看更多信息:
https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#file-reading