【问题标题】:Spring Integration + Inbound channel adapter + Recursive directory scannerSpring 集成 + 入站通道适配器 + 递归目录扫描器
【发布时间】:2020-04-22 21:15:14
【问题描述】:

入站通道适配器是使用轮询器创建的,以轮询根目录及其子目录中存在的文件

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()

}

这里 message.getpayLoad 正在打印 subdirectory1 即目录也被读取为文件消息

我可以在 trasnformer 中明确处理文件是否为目录并忽略,但想知道有什么方法可以在附加到入站通道适配器的递归目录扫描器中过滤它吗?

【问题讨论】:

    标签: file directory spring-integration


    【解决方案1】:

    这个问题很可能和这个SO线程有关:Spring Integration + file reading message source _ Inbound Channel Adapter + Outbound Gateway

    如果您可以丢失文件树,您需要三思而后行。听起来你想恢复FileWritingMessageHandler 中的一棵树。因此,在发送到该转换器之前,最好使用目录有效负载 @Filter 消息。

    如果您仍想从生产中跳过目录,请考虑使用ChainFileListFilter 而不是CompositeFileListFilter,并首先配置RegexPatternFileListFilter。 这样,来自RegexPatternFileListFilter 的过滤目录(默认情况下会跳过,请参阅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;
    }
    

    仅此而已。只要您的regex 仅用于文件,任何子目录都将被跳过并且不允许进入下游。

    【讨论】:

    • 非常感谢您的意见。我已经添加了带有正则表达式的链过滤器以排除目录,但是这将限制知道目录名称和每次添加新子目录时所需的更改,有没有办法通过扩展递归目录扫描器或在消息有效负载级别中排除文件编写器消息处理程序?
    • 好吧,首先让我知道您已阅读此答案!我没有说要为 dirs 应用正则表达式...
    • 请在我的回答中查看更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2014-12-07
    • 2023-03-21
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多