Итак, у меня была та же проблема, и у меня было следующее решение.Ранее неудачная попытка - пытался отслеживать статистику «lastModifiedTime» каждого файла, но я заметил, что увеличение размера большого файла может приостановиться на некоторое время. (Размер не изменяется непрерывно)
Основная идея - Для каждого события создайте файл триггера (во временном каталоге), имя которого имеет следующий формат -
OriginalFileName_lastModifiedTime_numberOfTries
Этот файл пуст и всеигра только во имя.Исходный файл будет рассматриваться только после прохождения интервалов определенной длительности без изменения его статистики «Время последнего изменения».(Примечание - поскольку это статистика файла, никаких накладных расходов нет -> O (1))
ПРИМЕЧАНИЕ - Этот файл триггера обрабатывается другой службой (скажем, ' FileTrigger ').
Преимущество -
- Нет сна или ожидания для удержания системы.
- Сбрасываетсредство просмотра файлов для мониторинга других событий
CODE для FileWatcher -
val triggerFileName: String = triggerFileTempDir + orifinalFileName + "_" + Files.getLastModifiedTime(Paths.get(event.getFile.getName.getPath)).toMillis + "_0"
// creates trigger file in temporary directory
val triggerFile: File = new File(triggerFileName)
val isCreated: Boolean = triggerFile.createNewFile()
if (isCreated)
println("Trigger created: " + triggerFileName)
else
println("Error in creating trigger file: " + triggerFileName)
CODE для FileTrigger (задание cron за интервал, скажем, 5 минут) -
val actualPath : String = "Original file directory here"
val tempPath : String = "Trigger file directory here"
val folder : File = new File(tempPath)
val listOfFiles = folder.listFiles()
for (i <- listOfFiles)
{
// ActualFileName_LastModifiedTime_NumberOfTries
val triggerFileName: String = i.getName
val triggerFilePath: String = i.toString
// extracting file info from trigger file name
val fileInfo: Array[String] = triggerFileName.split("_", 3)
// 0 -> Original file name, 1 -> last modified time, 2 -> number of tries
val actualFileName: String = fileInfo(0)
val actualFilePath: String = actualPath + actualFileName
val modifiedTime: Long = fileInfo(1).toLong
val numberOfTries: Int = fileStats(2).toInt
val currentModifiedTime: Long = Files.getLastModifiedTime(Paths.get(actualFilePath)).toMillis
val differenceInModifiedTimes: Long = currentModifiedTime - modifiedTime
// checks if file has been copied completely(4 intervals of 5 mins each with no modification)
if (differenceInModifiedTimes == 0 && numberOfTries == 3)
{
FileUtils.deleteQuietly(new File(triggerFilePath))
println("Trigger file deleted. Original file completed : " + actualFilePath)
}
else
{
var newTriggerFileName: String = null
if (differenceInModifiedTimes == 0)
{
// updates numberOfTries by 1
newTriggerFileName = actualFileName + "_" + modifiedTime + "_" + (numberOfTries + 1)
}
else
{
// updates modified timestamp and resets numberOfTries to 0
newTriggerFileName = actualFileName + "_" + currentModifiedTime + "_" + 0
}
// renames trigger file
new File(triggerFilePath).renameTo(new File(tempPath + newTriggerFileName))
println("Trigger file renamed: " + triggerFileName + " -> " + newTriggerFileName)
}
}