преждевременное завершение файла при синтаксическом анализе XML-файла, когда другой поток анализирует его во время его создания другим потоком - PullRequest
2 голосов
/ 04 августа 2011

У меня есть поток Java, который непрерывно опрашивает папку RESULTFOLDER и проверяет, есть ли в ней новые файлы.
Теперь файлы публикуются другой программой, работающей на другом компьютере, в RESULTFOLDER. Теперь файлы опубликованывсе XML-файлы (только XML). Поэтому в любой момент RESULTFOLDEr может содержать только XML-файлы.
Теперь мой поток A непрерывно опрашивает RESULTFOLDER и анализирует XML-файлы по одному, а затем удаляет его.
Теперь иногдапроисходит то, что, если поток A пытается прочитать и проанализировать файл A в то время, когда другая программа публикует файл A. В этом случае я получаю исключение при разборе файла. Говоря о предварительно зрелом конце файла.
Как я могурешить проблему?

Один из способов, который я думаю, это проверить дату и время создания файла и убедиться, что файл присутствует не менее 1 минуты или около того. Но я не думаю, что java предоставляет такой API. Как я могу это сделать?решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Вы можете записать файл .xml в папку, а затем написать отдельный контрольный файл, написанный после этого. Управляющий файл будет иметь нулевые байты и иметь другое расширение, например .ctl, но будет иметь такую ​​же первую часть имени.

Когда поток, опрашивающий папку результатов, находит файл .ctl, он знает, что безопасно открыть файл с тем же именем с расширением .xml.

Этот подход имеет дополнительное преимущество, заключающееся в том, что он будет работать, даже если задача записи находится на другом компьютере.

1 голос
/ 04 августа 2011

Создайте вызов потока setWritable (true, true) и setReadable (true, true) для файла во время создания.Это предотвратит доступ не создавающего потока к этому файлу, когда он создается создавающим потоком.После создания файла setWritable (true, false) и setReadable (true, false).Поток опроса должен будет проверить способность записи во время опроса, чтобы обеспечить чтение файла из.

В качестве альтернативы, вы можете предоставить мьютекс для каталога.Пусть поток, создающий файл, получит мьютекс для каталога, создаст и заполнит файл, а затем освободит мьютекс.Когда поток опроса должен выполнить свою проверку, возьмите мьютекс, проверьте каталог, обработайте файлы, затем освободите мьютекс.

0 голосов
/ 04 августа 2011

Три подхода:

  1. Поскольку файл записывается, он имеет имя foo.tmp.Как только оно полностью написано, оно переименовывается производителем в foo.xml.Таким образом, потребитель не увидит XML-файл, пока он полностью не будет написан производителем.

  2. (тот же ответ, что и @aaaa bbbb).Как только файл foo.xml полностью записан, создается другой файл (который может быть пустым) с именем foo.ctl.Потребитель не обрабатывает файл XML до тех пор, пока не увидит файл CTL, после чего он может удалить оба.

  3. (тот же ответ, что и @ tafoo85).Потребитель не может прочитать файл, пока он полностью не написан и не сделан читаемым для производителя.

Эти подходы имеют дополнительное преимущество - они работают правильно, даже если поток производителя умирает, находясь в серединенаписание неполного файла XML.

...