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

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 ответ

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

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

Другие вопросы по тегам