Spring Inbound Channel Adapter - как автоматически удалять папки и файлы старше 10 дней - PullRequest
0 голосов
/ 30 августа 2018

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 голосов
/ 30 августа 2018

Это не <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();
                    }
                }
            }
        }
    }
}

(Вы могли бы немного улучшить эту функцию: еще не тестировали ...)

...