Spring入站通道适配器-如何自动删除10天以上的文件夹和文件

时间:2018-08-30 12:16:46

标签: java spring java-8 spring-integration spring-integration-sftp

Integration.xml -这将获取目录中的所有文件

<int-file:inbound-channel-adapter id="delFiles" channel="delFiles" 
        directory="C:/abc/abc" use-watch-service="true" prevent-duplicates="false" auto-startup="true"
            watch-events="CREATE,MODIFY">
        <int:poller fixed-delay="1000"/>
        <int-file:nio-locker/>
    </int-file:inbound-channel-adapter>

我需要删除该文件夹和子文件夹中所有超过10天的文件。有人可以帮忙吗?

监听器

@Transformer(inputChannel="delFiles")
    public JobLaunchRequest deleteJob(Message<File> message) throws IOException {
        Long timeStamp = message.getHeaders().getTimestamp();
        return JobHandler.deleteJob(message.getPayload(), jobRepository, fileProcessor, timeStamp);
    }

处理程序

public static JobLaunchRequest deleteJob(File file, JobRepository jobRepository, Job fileProcessor, Long timeStamp) throws IOException {

//Is there a way in spring integration whether I can check this easily?
//How to check for folder and subfolders?
// This will check for files once it's dropped.
// How to run this job daily to check the file's age and delete?

    }

1 个答案:

答案 0 :(得分:1)

这不是<int-file:inbound-channel-adapter>的责任。这真的是关于根据您提供的过滤设置从目录中轮询文件。

如果您对旧文件不感兴趣,则可以实施自定义FileListFilter来跳过确实很旧的文件。

如果您仍然希望删除这些旧文件作为某些应用程序功能,则需要查看其他解决方案,例如@Scheduled方法,该方法遍历该目录中的文件并删除它们,例如每天一次,例如在午夜。

您也可以只在和逻辑中删除已处理的文件。由于您使用prevent-duplicates="false",因此将要一次又一次轮询同一文件。

要执行目录清理,您不需要Spring Integration:

public void recursiveDelete(File file) {
    if (file != null && file.exists()) {
        File[] files = file.listFiles();
        if (files != null) {
            for (File fyle : files) {
                if (fyle.isDirectory()) {
                    recursiveDelete(fyle);
                }
                else {
                    if (fyle.lastModified() > 10 * 24 * 60 * 60 * 1000) {
                        fyle.delete();
                    }
                }
            }
        }
    }
}

(您可能需要改进此功能:尚未测试...)