File Spring集成&x2B;入站通道适配器+;递归目录扫描程序
入站通道适配器是使用轮询器创建的,用于轮询根目录及其子目录中的文件File Spring集成&x2B;入站通道适配器+;递归目录扫描程序,file,directory,spring-integration,File,Directory,Spring Integration,入站通道适配器是使用轮询器创建的,用于轮询根目录及其子目录中的文件 e.g. RootDir |_abc.txt |_subdirectory1 |_subdirfile1.doc 问题是入站通道适配器正在以消息的形式读取目录 @Bean @InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller")) public Messa
e.g.
RootDir
|_abc.txt
|_subdirectory1
|_subdirfile1.doc
问题是入站通道适配器正在以消息的形式读取目录
@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
public MessageSource<File> fileReadingMessageSource(DirectoryScanner directoryScanner) {
FileReadingMessageSource sourceReader = new FileReadingMessageSource();
sourceReader.setScanner(directoryScanner);
}
@Bean
public DirectoryScanner directoryScanner() {
DirectoryScanner scanner = new RecursiveDirectoryScanner();
CompositeFileListFilter filter = new CompositeFileListFilter<>(
Arrays.asList(new AcceptOnceFileListFilter<>(), new RegexPatternFileListFilter(regex)));
scanner.setFilter(filter);
return scanner;
}
@Trasnformer(inputChannel="incomingchannel",....
torequest(Mesage<File> message) {
message.getPayload()
}
@Bean
@InboundChannelAdapter(autoStartup=“false”,value=“incomingchannel”,poller=@poller(“custompoller”))
公共消息源文件读取消息源(目录扫描程序目录扫描程序){
FileReadingMessageSourceReader=新建FileReadingMessageSource();
sourceReader.setScanner(directoryScanner);
}
@豆子
公共目录扫描程序目录扫描程序(){
DirectoryScanner scanner=新的递归DirectoryScanner();
CompositeFileListFilter=新的CompositeFileListFilter(
asList(新的AcceptOnceFileListFilter(),新的regexpaternFileListFilter(regex));
设置过滤器(过滤器);
回程扫描仪;
}
@转换器(inputChannel=“incomingchannel”,。。。。
torequest(Mesage消息){
message.getPayload()
}
此处message.getpayLoad正在打印子目录1,即目录也被读取为文件消息
我可以在trasnformer和ignore中显式处理文件是否为目录,但我想知道是否有任何方法可以在连接到入站通道适配器的递归目录扫描程序中对其进行过滤?此问题可能与此有关,因此线程: 如果你可以松开文件树,你需要三思而后行。我听上去你想在
FileWritingMessageHandler
中还原一个树。因此,在发送到该转换器之前,最好用目录负载过滤@消息
如果您仍然希望从生成中跳过DRE,请考虑使用<代码> Chan-FielistFaster < /C> >而不是<代码> CypTeIFielistFux,并首先配置<代码> ReGeExtReTnFielistFixs。
这样就可以从
regexpaternFileListFilter
中筛选出一个目录(默认情况下会跳过它,请参见AbstractDirectoryAwareFileListFilter
)根本不会转到AcceptOnceFileListFilter
。在当前配置中,AcceptOnceFileListFilter
首先接受一个目录,并真正忽略组合中的下一个筛选器
更新
我的意思应该是这样的:
@Bean
public DirectoryScanner directoryScanner() {
DirectoryScanner scanner = new RecursiveDirectoryScanner();
ChainFileListFilter filter = new ChainFileListFilter<>(
Arrays.asList(new RegexPatternFileListFilter(regex), new AcceptOnceFileListFilter<>()));
scanner.setFilter(filter);
return scanner;
}
@Bean
公共目录扫描程序目录扫描程序(){
DirectoryScanner scanner=新的递归DirectoryScanner();
ChainFileListFilter=新的ChainFileListFilter(
asList(新的regexparternfilelistfilter(regex),新的AcceptOnceFileListFilter());
设置过滤器(过滤器);
回程扫描仪;
}
仅此而已。只要您的regex
仅用于文件,任何子目录都将被跳过,不允许向下移动。非常感谢您的输入。我已使用regex添加了链式筛选器以排除目录,但这将限制我每次添加新的su时了解目录名和所需的更改B目录,有没有办法通过扩展递归目录扫描程序或filewritermessagehandler中的消息负载级别来排除?好吧,首先让我知道您已经阅读了这个答案!我没有说要为dirs应用regexp…请参阅我答案中的更新。