powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / доступ к файлу
90 сообщений из 90, показаны все 4 страниц
доступ к файлу
    #39485012
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте уважаемые!
тут столкнулся с проблемой при чтении из файла выбрасывает эксепшен:
Код: plaintext
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом

как можно узнать доступность файла?
или надо через вайл проверять в цикле?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485014
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

через вайл? File.canRead(), например? А в цикле, или как ещё, это уже ваши бизнес требования надо смотреть. Но вообще, проблема часто вылазит, если вы где-то файлы не закрываете. Особенно при записи.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485018
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Код: java
1.
2.
3.
4.
while (f.canRead() && f.canWrite() && f.exists()){
                        readingFile(eventDir + "\\" + eventPath);
                        break;
                    }



прослушивается каталог, и с поступлением нового файла читается, парсится и т.д.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
try (WatchService service = FileSystems.getDefault().newWatchService()) {
            Map<WatchKey, Path> keyMap = new HashMap<>();
            Path path = Paths.get(p);

            keyMap.put(path.register(service,
                    StandardWatchEventKinds.ENTRY_CREATE
            //                    ,StandardWatchEventKinds.ENTRY_DELETE
            //                    ,StandardWatchEventKinds.ENTRY_MODIFY
            ), path);

            WatchKey watchKey;

            do {
                watchKey = service.take();
                Path eventDir = keyMap.get(watchKey);

                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();
                    Path eventPath = (Path) event.context();
                    System.out.println(eventDir + " : " + kind + " : " + eventPath);
                    File f = new File(eventDir + "\\" + eventPath);

                    while (f.canRead() && f.canWrite() && f.exists()){
                        readingFile(eventDir + "\\" + eventPath);
                        break;
                    }
                }
            } while (watchKey.reset());
        } catch (Exception e) {
            System.out.println("exception on WatchService " + e);
        }



прикол в том что иногда я получаю эксепшн иногда все гладко идет...
...
Рейтинг: 0 / 0
доступ к файлу
    #39485026
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

Заведи ScheduledExecutorService и в случае исключения кидай туда задачу обработки файла. У задачи заведи счетчик, чтобы после N попыток её отменить.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485035
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

разве f.canRead() && f.canWrite() && f.exists() не обеспечивает условие?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485043
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как я понял тут говорится что canWrite() и т.д. не помогут? https://stackoverflow.com/questions/1500174/check-if-a-file-is-locked-in-java
...
Рейтинг: 0 / 0
доступ к файлу
    #39485058
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего два процесса (потока) крутят вотчеры и гоняют гонки за f.canRead()... e.t.c

Надо внимательно смотреть в ps -aux или tasklist на предмет процессов которые должны были
умереть но не умерли. Такое я иногда наблюдал при mvn test или если несколько сеансов
тестирования были запущены из среды.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485061
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСкорее всего два процесса (потока) крутят вотчеры и гоняют гонки за f.canRead()... e.t.c


как два? можно по подробнее
...
Рейтинг: 0 / 0
доступ к файлу
    #39485065
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарпрослушивается каталог, и с поступлением нового файла читается, парсится и т.д.
Это неправильно, поскольку файл сначала появляется, потом в него записывается содержимое, потом он закрывается. Читать и парсить его можно только после последней операции, а уведомление ты получаешь о первой.

Если есть возможность изменить логику софтины, которая файл записывает, то следует использовать такую: файл открывается с временным расширением, записывается, закрывается, переименовывается. Тогда по поступлению события переименования ты можешь его спокойно открывать, читать, парсить.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485069
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

так так так изначально хотел задавать именно этот вопрос как вообще происходит копирования файла вот и ответ, и получается я должен реагировать не на ENTRY_CREATE а на ENTRY_MODIFY?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485151
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а такая решения задачи допускается? с точки зрения правильного кодинга?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
do {
                watchKey = service.take();
                Path eventDir = keyMap.get(watchKey);

                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();
                    Path eventPath = (Path) event.context();
                    System.out.println(eventDir + " : " + kind + " : " + eventPath);
                    File f = new File(eventDir + "\\" + eventPath);

                    boolean b;
                    do {
                        b = true;
                        try (FileInputStream fis = new FileInputStream(f)) {
                            while (f.canRead() && f.canWrite() && f.exists()) {
                                readingFile(eventDir + "\\" + eventPath);
                                break;
                            }
                        } catch (IOException ex) {
                            System.out.println("Файл занят " + ex);
                            b = false;
                        }
                    } while (!b);
...
Рейтинг: 0 / 0
доступ к файлу
    #39485153
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МузаффарmaytonСкорее всего два процесса (потока) крутят вотчеры и гоняют гонки за f.canRead()... e.t.c


как два? можно по подробнее
Когда возникнет проблема - сделай в консоли
Код: java
1.
$ jps -l 


и покажи что вышло.

Потом я разовью мысль.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485175
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как делаю я:

При получении оповещения о появлении нового файла пытаюсь его открыть в монопольном режиме. Если не получается, в цикле жду некоторый интервал и снова пытаюсь открыть. Если суммарное время интервалов превышает некий максимум, считаю, что с файлом поработать не случилось.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485179
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. Я думаю еще стоит нам всем обратить внимание на FileLock::lock()
...
Рейтинг: 0 / 0
доступ к файлу
    #39485202
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: java
1.
$ jps -l 


и покажи что вышло.

Потом я разовью мысль.
сорри но как это делается?


да скорее проблема в локе походу...

а чем мой вариант плох?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485204
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[рукалицо]

Открой консоль (что у тебя Windows или RHEL) и набери текст который я тебе набил. В ответ тебе
выскочит список java процессов запущенных в данный момент. Я подозреваю что ты не прибил старый
процесс и сам себя заблочил....

Фууууххх....

Ферштейн?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485205
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

винда, йа йа... ))
но не всегда есть эксепшен...
...
Рейтинг: 0 / 0
доступ к файлу
    #39485206
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что получил при добавлении нового файла...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
c:\testFolder\in : ENTRY_CREATE : 95.txt
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Using file name c:\testFolder\in\95.txt
Размер файла: 302 байт(а)
can not reading SPR93 TrainTables.HtmlTable@3d4eac69
Размер файла: 302 байт(а)
can reading SPR95 TrainTables.HtmlTable@42a57993
<html>
<body>
ВЦ УТИ 95 04.07 09-29 ВЦ 73 ПОДХОД ПОЕЗДОВ К СТАНЦИИ ЧУКУР 
<table>
<tr><th>НОМЕР</th><th>ИНДЕКС</th><th>СОСТ</th><th>СТАН</th><th>ДАТА</th><th>ВРЕМЯ</th></tr>
<tr><td>0370</td><td>0000  04 0370</td><td>ОТПР</td><td>КЕЛЕС</td><td>04.07</td><td>04-45</td></tr>
<tr><td>4401</td><td>7236  01 7235</td><td>ОТПР</td><td>КЗТУК</td><td>04.07</td><td>06-40</td></tr>
<tr><td>3605</td><td>7261  88 0060</td><td>ОТПР</td><td>УЗБЕК</td><td>04.07</td><td>06-44</td></tr>
<tr><td>3620</td><td>7200  76 7222</td><td>ОТПР</td><td>КЕЛЕС</td><td>04.07</td><td>06-53</td></tr>
</table>
</body>
</html>
...
Рейтинг: 0 / 0
доступ к файлу
    #39485211
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сведеньям jps вроде все ОК. У тебя 1 процесс TrainTables.main. Это хорошо.

Значит причины блокировки либо в 3-м приложении (антивирус?) либо ты так написал код
что блокируешь сам себя.

Теперь вопросы:
1) Откуда ты взял этот код? Сам написал?

Код: java
1.
2.
3.
4.
 while (f.canRead() && f.canWrite() && f.exists()) {
                                readingFile(eventDir + "\\" + eventPath);
                                break;
                            }


Здесь между проверкой на canRead(), canWrite() есть ненулевой тик времени когда файл теоретически
может быть захвачен другим потоком (процессом). Нарушается базовый принцип работы с блокировками.
Ты не можешь пробовать или щупать статус блокировки. Ты должен блокировать сразу.

2) Я до конца не помню как работает WatchService. Но может-ли он ловить своё собственное эхо?
Тоесть поймать положительную обратную связь от процесса readingFile? И что внутри raeadingFile?
Поток? Асинхронный вызов?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485214
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

может быть проблема в антивире...

счас узнаем, и так выключил автоматическую защиту антивира, 3 раза зациклился... значит антивир не причем.

авторлибо ты так написал код что блокируешь сам себя.
ну вотчер был взять кдето из доках оракла...


автор Откуда ты взял этот код? Сам написал?
сам, думал поможет так как в доке написан для чтения (Tests whether the application can read the file denoted by this abstract pathname.) а для записи (Tests whether the application can modify the file denoted by this abstract pathname.) как я понял тут может ли читать, может ли записать...

авторЗдесь между проверкой на canRead(), canWrite() есть ненулевой тик времени когда файл теоретически
может быть захвачен другим потоком (процессом). Нарушается базовый принцип работы с блокировками.
Ты не можешь пробовать или щупать статус блокировки. Ты должен блокировать сразу.
может быть а может на самом деле файл сначала появляется, потом в него записывается содержимое, потом он закрывается и вотчер при появлении собирается читать когда ОС ещё записывает туда инфо?

автор2) Я до конца не помню как работает WatchService. Но может-ли он ловить своё собственное эхо?
Тоесть поймать положительную обратную связь от процесса readingFile? И что внутри raeadingFile?
Поток? Асинхронный вызов?
возможно и я не до конца понимаю...
хз, но когда ридингФайл не смог получить доступ Вотчер сразу давал ислкючения и завершал процесс полностью
нет не поток
можно сказать да, хотя об этом не думал даже...
...
Рейтинг: 0 / 0
доступ к файлу
    #39485224
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарвозможно и я не до конца понимаю...
хз, но когда ридингФайл не смог получить доступ Вотчер сразу давал ислкючения и завершал процесс полностью
нет не поток
можно сказать да, хотя об этом не думал даже...
Мне остается только вздыхать и сочувственно кивать. У меня-же нет никаких
сведений по readingFile(...).
...
Рейтинг: 0 / 0
доступ к файлу
    #39485236
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
доступ к файлу
    #39485271
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... я скопировал 1 единственный html файл и ошибка сразу воспроизвелась.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485294
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я провел еще один эксперимент в большим файлом (1.4Г) и убедился что событие ENTRY_CREATE
прилетает до завершения финализации копирования. Это немножко не то событие. Нам по хорошему
нужно реагировать на закрытие (CLOSE) файла после копирования. Я ищу в спеках WatchService
но ничего не нахожу.

Бесконечный цикл с проверкой canRead(), canWrite() является по моему мнению нехорошим
паттерном. Мне не верится что имемнно такой подход используется в веб-контейнерах
к примеру для мониторинга изменений *.jsp. Скорее всего там нечто более умное. Вот
это умное нам надо найти.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485298
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
доступ к файлу
    #39485299
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема без ответа
http://www.cyberforum.ru/java-j2se/thread1215925.html
...
Рейтинг: 0 / 0
доступ к файлу
    #39485309
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНам по хорошему нужно реагировать на закрытие (CLOSE) файла после копирования. Я ищу в спеках WatchService но ничего не нахожу.
Потому что нет его: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364391(v=vs.85).aspx
...
Рейтинг: 0 / 0
доступ к файлу
    #39485311
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
да кстати я забыл выложит нужные файлы тоже чтоб вы посморели итоговый файл...

кстати все таки уважаемый Dimitry Sibiryakov говорил на счет копирования...

а на счет canRead и canWrite можно их убрать все равно такая ситуация будет, там только изза do while программа не падает а так падал бы
...
Рейтинг: 0 / 0
доступ к файлу
    #39485313
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут внутри 3 файла
...
Рейтинг: 0 / 0
доступ к файлу
    #39485413
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарприкол в том что иногда я получаю эксепшн иногда все гладко идет...А что за приложение, которое создает/копирует файлы в эту папку? Вами разработана?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485418
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раскомментарил типы событий. Понаблюдал за событиями от вотчера.

Если мы копируем файл ненулевой длины то получаем:
1) Одно событие ENTRY_CREATE
2) Пакет событий ENTRY_MODIFY

Вобщем-то мой поинт в том что нужно завести какую-то служебную структуру
тира Map<File,State> и фиксировать статус файла.

На каждое событие обновлять статус. И если детектирован факт перехода
с ENTRY_MODIFY файла X на ENTRY_CREATE файла Y то мы (условно)
считаем что файл Х завершил свою дозапись (append).

Мой поинт основан на предположении что файловые блокировки
дороже стоят и нам лучше их использовать по минимуму.

Еще один поинт. В силу сложности организации самого процесса
вотчинга (сопряжение с файловой системой) и много шумящих
событий мы никогда не добъемся отсуствия IOExceptions. Они
всегда будут. Но мы сможем снизить их вероятность.

И последний поинт. Это уже относится к процессу который
создает html файлы. Его можно сделать так чтобы он
создавал файлы с расширением *.$$$ а после финализации
переименовывал в html. Этот хинт часто используют в Linux
для достижения определенной атомарности файловых
событий и для защиты от случайного захвата скриптом
недописанного архива (к примеру).
...
Рейтинг: 0 / 0
доступ к файлу
    #39485438
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот жеж люди ...
Умный человек уже сказал что делать: создать, заполнить, закрыть, переименовать (переместить).
Но, блин, мы вы создадим кучу костылей, но не будем делать правильно.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485442
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВот жеж люди ...
Умный человек уже сказал что делать: создать, заполнить, закрыть, переименовать (переместить).
Но, блин, мы вы создадим кучу костылей, но не будем делать правильно.
ты почитай внимательно, прежде чем высказываться.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485448
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanА что за приложение, которое создает/копирует файлы в эту папку? Вами разработана?

это левая даже можно сказать основная корпоративная система из далеких 70-80х...

mayton, это все ради того что Вы опасаетесь, что процесс (ОС) может не давать разрешение и я не выхожу из цикла?

но если счетчик то: с одной стороны тоже можно, но мы может и никогда не получим нужную инфу а это совсем не есть хорошо мне кажется, т.е. это будет последней точкой для проекта, т.к. не годный... думаю тоже не айс.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485450
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ последний поинт. Это уже относится к процессу который
создает html файлы. Его можно сделать так чтобы он
создавал файлы с расширением *.$$$ а после финализации
переименовывал в html. Этот хинт часто используют в Linux
для достижения определенной атомарности файловых
событий и для защиты от случайного захвата скриптом
недописанного архива (к примеру).

кстати это тестовый модуль и в конечном продукте я не создам файл хтмл или ещё что то, после парсинга адресату вышлю/покажу ответ в табличном виде...
...
Рейтинг: 0 / 0
доступ к файлу
    #39485754
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonесли детектирован факт перехода
с ENTRY_MODIFY файла X на ENTRY_CREATE файла Y то мы (условно)
считаем что файл Х завершил свою дозапись (append).
А потом в каталог приходят два писателя и мы опять удивляемся почему у нас в файле только половина содержимого.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485840
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из сказанных сделал пока так...
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
boolean b;
int i = 0;
do {
    Thread.sleep(1000);
    System.out.println("size " + f.length());
    b = true;
    try (FileInputStream fis = new FileInputStream(f)) {
        System.out.println("Файл обрабатывается!");
        readingFile(eventDir + "\\" + eventPath);
        break;
    } catch (IOException ex) {
        i++;
        if (i < 10) {
            System.out.println("Файл занят " + ex);
            b = false;
        } else {
            System.out.println("Повторите попытку позже, т.к. " + ex.getMessage());
            break;
        }
    }
} while (!b);
...
Рейтинг: 0 / 0
доступ к файлу
    #39485890
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарэто левая даже можно сказать основная корпоративная система из далеких 70-80х...будет круто, если получится подрубиться прямо к базе той системы... такое ощущение, что это просто экспорт табличных данных в файл
...
Рейтинг: 0 / 0
доступ к файлу
    #39486114
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanбудет круто, если получится подрубиться прямо к базе той системы... такое ощущение, что это просто экспорт табличных данных в файл

Да было бы круто но вот система вообще не использует субд, прямого доступа к систему не имеется и работаю через так называемый концентратор...
...
Рейтинг: 0 / 0
доступ к файлу
    #39486204
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что то все замолчали...
...
Рейтинг: 0 / 0
доступ к файлу
    #39486213
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарчто то все замолчали...
Решение через Thread.sleep() плохо тем что оно кушает потоки. Если вы используете пул в 10 потоков для обработки входящих файлов, то 10 файлов достаточно чтобы ваш пул усыпить на довольно продолжительное время.
...
Рейтинг: 0 / 0
доступ к файлу
    #39486229
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музафар мне щас некогда я убегаю. Несколько поинтов:

1) Мы обрабатываем события файловой системы медленнее чем они поступают.
Это не есть гуд т.к. будут потери событий (там есть спец константа для этого)
либо (возможно) будет другая ситуация. Тебе и участникам топика надо выкурить док по Watcher полностью.

2) Я-бы предложил обрабатывать события в Executor. Но перед этим события должны
пройти некую умную фильтрацию о которой я писал выше. Тоесть убрать "дребезг"
или многократное срабатывание ENTRY_MODIFY.

Вечером продолжим.
...
Рейтинг: 0 / 0
доступ к файлу
    #39486314
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczРешение через Thread.sleep() плохо тем что оно кушает потоки. Если вы используете пул в 10 потоков для обработки входящих файлов, то 10 файлов достаточно чтобы ваш пул усыпить на довольно продолжительное время.

а TimeUnit.SECONDS.sleep(); ? или это тоже самое?
...
Рейтинг: 0 / 0
доступ к файлу
    #39486325
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффара TimeUnit.SECONDS.sleep(); ? или это тоже самое?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
ScheduledExecutedService scheduler = ...

try {
    processFile(file);
} catch (Exception e) {
    log.error(e);
    if(errorCount < threshold) scheduler.schedule(this, delay, timeUnit);
}



Таким нехитрым способом вы не усыпляете потоки почем зря. А в случае ошибки закидываете задачу в очередь, а поток может заняться обработкой других файлов.
...
Рейтинг: 0 / 0
доступ к файлу
    #39486365
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

спасибо за советы, кстати после анализа я так понял что мне достаточно секунда задержки чтоб система разлочил копируемый файл...
...
Рейтинг: 0 / 0
доступ к файлу
    #39486366
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТаким нехитрым способом вы не усыпляете потоки почем зря. А в случае ошибки закидываете задачу в очередь, а поток может заняться обработкой других файлов.
Я бы даже вообще все файлы сначала в executor пулял, чтобы дать время завершить запись.
...
Рейтинг: 0 / 0
доступ к файлу
    #39486987
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потом в каталог приходят два писателя и мы опять удивляемся почему у нас в файле только половина содержимого.
Замечание ценное. И справедливое. Выше я уже упоминал что на интерфейсе Watcher мы не сможем
100% точно отработать событие ::close() и нам придется делать несколько "пристрелочных" выстрелов
по файлу с целью поймать состояние когда он уже финализирован.

Еще.

До того как начнет работать HtmlParser я-бы предложил в целях оптимизации прогнать валидатор.
Это новая алгоритмическая сущность которую нужно создать. Валидация будет проходить по критериям
- размер файла (мы не будем брать в обработку файлы меньше 2Кб к примеру)
- простейшая проверка на консистентность (для html-файла к примеру это наличие финализирующего тега </html>)

Если файл не проходит валидацию то мы откладываем его парсинг на некоторое время. Предполагается
что внешний процесс еще пишет этот файл.

Еще. Блажкович предложил делать таймаут перед повторной обработкой файла с ScheduledExecutedService.
Я-бы предложил ввести опцию "растущего таймаута" по экспоненте. Данная опция позволит не "долбить"
по очень длинным и часто изменяющимся файлам (два процесса сливают два лога) а просто отодвинуть
их обработку на потом в связи с неудачами.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487101
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

мне кажется что Вы взялись на проблему очень глобально... это конечно радует но и пугает...

авторнам придется делать несколько "пристрелочных" выстрелов
по файлу с целью поймать состояние когда он уже финализирован
да и получить эксепшен если файл не разлочан, так? ну дальше обработать этот эксепшн

авторДо того как начнет работать HtmlParser я-бы предложил в целях оптимизации прогнать валидатор.
Это новая алгоритмическая сущность которую нужно создать. Валидация будет проходить по критериям
- размер файла (мы не будем брать в обработку файлы меньше 2Кб к примеру)
- простейшая проверка на консистентность (для html-файла к примеру это наличие финализирующего тега </html>)

придется брать файлов меньше 2КБ :) и файлы не более чем 1МБ (если я не ошибаюсь)
второго я не совсем понял при чем тут хтмл файл?

авторЕсли файл не проходит валидацию то мы откладываем его парсинг на некоторое время. Предполагается
что внешний процесс еще пишет этот файл.
и не легче ли просто ждать скажем 1секунд перед началом парсинга и после появлении файла как предлагал Блазкович?
...
Рейтинг: 0 / 0
доступ к файлу
    #39487105
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вы переименуете если файл залочен?
Мне кажется не средства узнать о разлочке кроме долбления с райзе.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487106
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял. Писать в темп, а ловить свой файл?
Если событие работает, то более ничего не надо.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487114
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарпридется брать файлов меньше 2КБ :) и файлы не более чем 1МБ (если я не ошибаюсь)
второго я не совсем понял при чем тут хтмл файл?

Это в качестве примера я взял. Почти любой файловый формат имеющий спецификацию
позволяет определять свою валидность. К примеру. Бинарные форматы указывают свой размер
в заголовке (прямо или косвенно).

Бинарные или символьные потоковые форматы (xml, json) имеют ярко выраженные
старт-стопные последовательности по которым можно точно сказать
что файл финализирован.

и не легче ли просто ждать скажем 1секунд перед началом парсинга и после появлении файла как предлагал Блазкович?
Можно ждать 1 или 2 секунды. Эту цифро подобрать экспериментально исходя из оптимального
времени "готовности" файла. Вообще таймаут - это нормальное состояние например в сетевых
протоколах. Единственный момент - не делать sleep(..) внутри потока. А как-то по другому
возвращать в пул неработающих потоков. Например как предложил Блажкович.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487118
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

мы просто так исходя из содержимого не можем конкретно сказать что файл закончился или ещё туда пишутся данные, т.к. разные файлы точнее разные содержания.

да со слипом все так посоветовали, хотя самым легким вариантом был :)

вот с шедулером не могу разобраться что к чему...
...
Рейтинг: 0 / 0
доступ к файлу
    #39487126
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарmayton,

мы просто так исходя из содержимого не можем конкретно сказать что файл закончился или ещё туда пишутся данные, т.к. разные файлы точнее разные содержания.

Это твои файловые форматы Spravka02,93... ?
...
Рейтинг: 0 / 0
доступ к файлу
    #39487151
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Задача подсистемы выдать событие конца записи файла. Я бы валидацию делал ИС.
Один доп.поток справится.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487159
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

это шаблоны справок для парсинга

а так получаю такого рода файлы наименования тоже специфическая 01022400.00Х (расширения начинается с 000 по FFF)
...
Рейтинг: 0 / 0
доступ к файлу
    #39487652
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

Openfiles - Queries or displays open files. Also queries, displays, or disconnects files opened by network users.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487735
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman Openfiles - Queries or displays open files. Also queries, displays, or disconnects files opened by network users.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487747
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если всё происходит "на винде", то перемещать (since 1.7) файлы из исходного каталога в промежуточный.
Самый хороший вариант - научить перемещать готовые к обработке файлы их поставщика.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487758
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЕсли всё происходит "на винде", то перемещать (since 1.7) файлы из исходного каталога в промежуточный.
Самый хороший вариант - научить перемещать готовые к обработке файлы их поставщика.
ну читать же надо тс ....
чтоб переместить надо чтоб файл был свободен. а когда писался поставщик винда была в зачатке....
...
Рейтинг: 0 / 0
доступ к файлу
    #39487761
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReadDirectoryChangesW function

и отслеживать с такими параметрами:

- FILE_NOTIFY_CHANGE_SIZE
- FILE_NOTIFY_CHANGE_LAST_WRITE

периодически вызываем функцию и выЩЩитываем разницу (размер/время)...
и по истечении определенного интервала можно сделать вывод, что в файл уже никто не пишет.

реализовать можно при помощи JNA
...
Рейтинг: 0 / 0
доступ к файлу
    #39487803
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяну читать же надо тс ....Именно.
Топикстартеру требуется начинать обработку файла тогда, когда поставщик закончил запись в него.
Если добавить промежуточное перемещение, то (в случае Windows) файлы, попавшие в этот промежуточный католог - гарантированно готовы к обработке.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487808
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanреализовать можно при помощи JNA При помощи JNA (или даже без его помощи) можно просто открывать файл с опцией, дающей ошибку, если файл уже открыт на запись. Гораздо проще обработать ошибку, чем рожать (негарантированную) эвристику.
Но, опять-таки, в юниксах с файловыми блокировками не очень хорошо: чтобы работало, правила должны соблюдать все участники.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487846
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovИменно.
Топикстартеру требуется начинать обработку файла тогда, когда поставщик закончил запись в него.
Если добавить промежуточное перемещение, то (в случае Windows) файлы, попавшие в этот промежуточный католог - гарантированно готовы к обработке.
ты читал что делал mayton ? он копировал файл. копировал средствами windows. не писал "поставщиком" , а копировал созданный файл.

Basil A. SidorovПри помощи JNA (или даже без его помощи) можно просто открывать файл с опцией, дающей ошибку, если файл уже открыт на запись. Гораздо проще обработать ошибку, чем рожать (негарантированную) эвристику.что и делает 20625966 .
...
Рейтинг: 0 / 0
доступ к файлу
    #39487847
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
Конечно, чем проще тем лучше.
Раз в 5 минут идет поток и перекидывает файлы в папку /My/....
Те что смог, они ушли на обработку.
Железобетонный энтерпрайз.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487851
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Конечно, чем проще тем лучше.
Раз в 5 минут идет поток и перекидывает файлы в папку /My/....
Те что смог, они ушли на обработку.
Железобетонный энтерпрайз.прослушиваем папку /My/...., нарываемся на файл, который копируется и возвращаемся к началу топика....
...
Рейтинг: 0 / 0
доступ к файлу
    #39487862
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Ты не в курсе что переписывание мгновенное?
...
Рейтинг: 0 / 0
доступ к файлу
    #39487870
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадя,
Ты не в курсе что переписывание мгновенное?как-то не приходилось с этим сталкиваться ...
перенос - да, когда из одной папки в другую - только в mfs переписывается....
но сначала надо дождаться когда файл освободится, потом перенести - гораздо проще и быстрее так обработать 20625966
Petro123Раз в 5 минут ии кто будет ждать 5 минут? когда проще и быстрее обработать эксепшен при обращении к файлу?
...
Рейтинг: 0 / 0
доступ к файлу
    #39487874
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
А когда обращатся, если он еще пишется?
Быстрота нужна при ловле блох.
А в Ынтырпрайзе - надежность и простота.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487876
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123А когда обращатся, если он еще пишется?
Быстрота нужна при ловле блох.
А в Ынтырпрайзе - надежность и простота.когда пишется - происходит эсепшен. его и обрабатываешь в цикле.
этих циклов примерно 5-8. файлы маленькие. делать "универсальное" для произвольного размера - нет смысла - файлы маленькие, мах 10к.... стабильно до 1к.
чем предложенный вариант не прост и не надёжен? (единственно - добавить счётчик циклов, для выхода из цикла)
...
Рейтинг: 0 / 0
доступ к файлу
    #39487877
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Быстрота нужна при ловле блох.юзер запросил данные и сидит курит 5 минут.....21 век б...ь
...
Рейтинг: 0 / 0
доступ к файлу
    #39487878
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Тем что у тебя 8 циклов, а с константой 2 мин или 5 будет 2 прохода.
А вообще, мне пофигу. Делай.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487882
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Тем что у тебя 8 циклов, а с константой 2 мин или 5 будет 2 прохода.
А вообще, мне пофигу. Делай.8 циклов 100мс, или 2 прохода за 5 минут - есть разница?
...
Рейтинг: 0 / 0
доступ к файлу
    #39487883
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123А вообще, мне пофигу.супер аргумент профи.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом шаблоне есть уникальная стоп-последовательность типа смайлика.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
BЦ УTИ     93 06.06 12-31 BЦ 73
HAЛИЧИE ПOEЗДOB HAXOДЯЩИXCЯ HA CT. ЧYKYP 

HOMEP    ИHДEKC    COCT ДATA  BPEMЯ ПAPK  BAГ УДЛ БPУTT
3422 7200  92 7236 ФOPM 06.06 00-03 00/00  60  66  5095 
3502 7200  93 7230 ФOPM 06.06 00-40 00/00  51  56  4702 
3602 7200  94 7224 ФOPM 06.06 01-11 00/00  52  58  2835 
2310 6980 718 7200 ПPИБ 06.06 09-38 00/00  57  70  4205 
2004 7200  95 7258 ПPИЦ 06.06 11-19 00/00  55  58  2335 
3630 7200  96 7235 ФOPM 06.06 07-54 00/00  53  57  3897 
3641 7200  97 7222 ФOPM 06.06 08-58 00/00  50  58  4015 
3504 7200  99 7407 OTЦ  06.06 11-16 00/00  52  55  4364 
1256 7076  15 7200 ПPИБ 06.06 05-19 00/00  53  57  1822 

(:0497 BЦ УTИ  1173029 06 06 12 31 001:
Ю1 0000 212 001 000 0:)
...
Рейтинг: 0 / 0
доступ к файлу
    #39487942
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяты читал что делал mayton ? он копировал файлРазницу между "скопировать" и "переместить" совсем не понимаем?
Если вы не в курсе возможности копировать открытые на запись файлы, то уж опция ATOMIC_MOVE функции NIO-пакета должна была навести хоть на какие-то мысли?
...
Рейтинг: 0 / 0
доступ к файлу
    #39487955
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovвадяты читал что делал mayton ? он копировал файлРазницу между "скопировать" и "переместить" совсем не понимаем?
Если вы не в курсе возможности копировать открытые на запись файлы, то уж опция ATOMIC_MOVE функции NIO-пакета должна была навести хоть на какие-то мысли?
был предложен вариант с ожиданием ,через эксепшен без шедулера, чем он плох?
зачем городить ещё перемещение и пр. в любом случае надо дожидаться окончания записи.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487957
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадясупер аргумент профи
спорить до усрачки по миллисекундам только у тебя получается.
когда не можешь аргументированно ответить — переход на дичности не украшает.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487958
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
я так понимаю, у ТС проблем с парсингом нет...
...
Рейтинг: 0 / 0
доступ к файлу
    #39487986
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Все решения рабочие. Дальше надо по месту ТСу решать. Тестовую площадку делать.
Дон Ки Хот ты наш.
Ферштейн?
...
Рейтинг: 0 / 0
доступ к файлу
    #39487987
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ этом шаблоне есть уникальная стоп-последовательность типа смайлика.

да только в этом ответе, иногда именно этот запрос но нет последних строк, к тому же счас делаю для двух запросов и там по 25 как минимум разновидностей т.е. по содержимому запроса меняется получаемый ответ к примеру
запрос 212 требуется 93я справка по станцию А (код станции скажем 1000)
мы должны писать: (:212 0 1000:93:)
есть справка 95 там уже другой ответ
(:212 0 1000:95:)
и не у всех заканчивается со смайликом...

кстати для перемещение нам не обязательно знать файл залочан/разлочан? если это залочанный файл то не можем переместит то в чем вопрос? мы все равно должны ждать пока система не отпустит...

а на счет файла может я не правильно делал хз, но когда использовал метод available() то всегда получил один и тот же размер файла при том итоговый размер
...
Рейтинг: 0 / 0
доступ к файлу
    #39487988
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадя,
Все решения рабочие. Дальше надо по месту ТСу решать. Тестовую площадку делать.
Дон Ки Хот ты наш.
Ферштейн?
вот это ответ, спасибо.
...
Рейтинг: 0 / 0
доступ к файлу
    #39487989
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Дон Ки Хот ты наш.


)))))
...
Рейтинг: 0 / 0
доступ к файлу
    #39488003
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Открой текст файл и пробуй переместить. Если райзе, то не готов. До след.раза.
Не понял алгоритм? )).
...
Рейтинг: 0 / 0
доступ к файлу
    #39488007
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

если файл открыт то система не даст перемещать, или не?
...
Рейтинг: 0 / 0
доступ к файлу
    #39488039
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, если это файловая шара - то нам может быть грантован доступ R/O.

Впрочем можно уточнить у автора. Но удаление файла на ходу процесса
записи, с точки зрения другого процесса - это как-бы не по "джентльменски"
и здесь надо искать какой-то мягкий протокол.

Идеальный вариант это конечно расширение .lock или любое другое
как маркер активности.

Вообще вся беда этой постановки идет от dirty-режимов работы с файловой
системой.
...
Рейтинг: 0 / 0
доступ к файлу
    #39488040
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Не даст. Ты прямо счас не можешь без ррограммирлвания в проводнике проверить что ли?
...
Рейтинг: 0 / 0
доступ к файлу
    #39488043
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Система же многопользовательская?
Я не раз встречал метод проверки - открыть на запись с райзе.
Ты прав, надо тз смотреть.
А то что бд нет, сами себе ССЗБ
...
Рейтинг: 0 / 0
доступ к файлу
    #39488089
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

об этом и я говорю что система не даст это сделать...
...
Рейтинг: 0 / 0
доступ к файлу
    #39488258
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МузаффарPetro123,

об этом и я говорю что система не даст это сделать...
Ты эмоционально не окрасил пост)).
Т.е. топик закрываем и ты пошел делать тесты.
...
Рейтинг: 0 / 0
доступ к файлу
    #39488623
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Ты эмоционально не окрасил пост)).
Т.е. топик закрываем и ты пошел делать тесты.

))
по Вашему что должен был отвечать?
...
Рейтинг: 0 / 0
90 сообщений из 90, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / доступ к файлу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]