powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java - WatchService - проверка не занят ли файл другим процессом?
10 сообщений из 10, страница 1 из 1
Java - WatchService - проверка не занят ли файл другим процессом?
    #38895325
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

написал небольшой сервис на Java который смотрит на директорию с логами и если в лог что-то дописывается - он реагирует.
Проблема возникает когда пишется лог от nginx, наблюдение ведется также за tomcat и WildFly (на нем и бегает сервис).
AccesDeniedException - эту ошибку я ловлю и обрабатываю, но всё-равно через некоторое время - сервер просто ложиться....

Почему-то только nginx.
Постоянно вот такая ошибка


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[0m[0m23:48:21,928 INFO  [com.jdev.logsviewer.listeners.StompDisconnectEvent] (_Watcher_NGINX) Received WatchEvent: 'ENTRY_MODIFY' - for file: access.log
[0m[0m23:48:21,928 INFO  [com.jdev.logsviewer.listeners.StompDisconnectEvent] (_Watcher_NGINX) Received WatchEvent: 'ENTRY_MODIFY' - for file: access.log
[0m[0m23:48:21,928 INFO  [com.jdev.logsviewer.commons.LogsViewerCommonFunctions] (_Watcher_NGINX) Cannot read a file content or file attributes!
[0m[31m23:48:21,929 ERROR [stderr] (_Watcher_NGINX) java.nio.file.AccessDeniedException: /var/log/nginx/access.log
[0m[31m23:48:21,929 ERROR [stderr] (_Watcher_NGINX) 	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
[0m[31m23:48:21,929 ERROR [stderr] (_Watcher_NGINX) 	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
[0m[31m23:48:21,929 ERROR [stderr] (_Watcher_NGINX) 	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
[0m[31m23:48:21,929 ERROR [stderr] (_Watcher_NGINX) 	at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
[0m[31m23:48:21,930 ERROR [stderr] (_Watcher_NGINX) 	at java.nio.file.Files.newByteChannel(Files.java:317)
[0m[31m23:48:21,930 ERROR [stderr] (_Watcher_NGINX) 	at java.nio.file.Files.newByteChannel(Files.java:363)
[0m[31m23:48:21,930 ERROR [stderr] (_Watcher_NGINX) 	at java.nio.file.Files.readAllBytes(Files.java:2981)
[0m[31m23:48:21,930 ERROR [stderr] (_Watcher_NGINX) 	at com.jdev.logsviewer.commons.LogsViewerCommonFunctions.createLog(LogsViewerCommonFunctions.java:48)
[0m[31m23:48:21,930 ERROR [stderr] (_Watcher_NGINX) 	at com.jdev.logsviewer.service.LogsFolderWatcher.run(LogsFolderWatcher.java:58)
[0m[31m23:48:21,930 ERROR [stderr] (_Watcher_NGINX) 	at java.lang.Thread.run(Thread.java:745)



Можно как-то проверять не занят ли файл другим процессом? Когда освободиться тогда и считывать, - становиться в очередь или как-то так... Спасибо за подсказки.
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38895398
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, есть что-то вроде File.canRead().
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38895653
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Спасибо, хмммм, насколько я посмотрел в watchService нет такого метода, а наблюдает за папко он.
Вот код.

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
private void createWatchService(Folder folder) {
		try {
			Path dir = Paths.get(folder.getValue());
			WatchService watcher = FileSystems.getDefault().newWatchService();
			LogsFolderWatcher fileWatcher = new LogsFolderWatcher(watcher, folder, simpMessagingTemplate);
			Thread thread = new Thread(fileWatcher, LogsViewerConstants.WATCHER_PREFIX + folder);
			thread.start();
			logger.info("Added watcher for " + folder + " folder");
			dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


-------------------------

/**
 * @author JDev
 *
 */
public class LogsFolderWatcher implements Runnable {

	private static final Logger logger = LoggerFactory.getLogger(StompDisconnectEvent.class);

	private WatchService watcher;
	private Folder folderToWatch;
	private SimpMessagingTemplate simpMessagingTemplate;

	public LogsFolderWatcher(WatchService watcher, Folder folderToWatch, SimpMessagingTemplate simpMessagingTemplate) {
		this.watcher = watcher;
		this.folderToWatch = folderToWatch;
		this.simpMessagingTemplate = simpMessagingTemplate;
	}

	/**
	 * In order to implement a file watcher, we loop forever ensuring requesting
	 * to take the next item from the file watchers queue.
	 */
	@SuppressWarnings("rawtypes")
	@Override
	public void run() {
		try {
			// get the first event before looping
			WatchKey key = watcher.take();
			while (!Thread.currentThread().isInterrupted()) {
				// we have a polled event, now we traverse it and
				// receive all the states from it
				for (WatchEvent event : key.pollEvents()) {
					Path dir = (Path) key.watchable();
					Path fullPath = dir.resolve((Path) event.context());

					logger.info("Received WatchEvent: '" + event.kind() + "' - for file: " + event.context().toString());

					Log changedLog = LogsViewerCommonFunctions.createLog(fullPath.toFile(), WatchState.valueOf(event.kind().name()));
					simpMessagingTemplate.convertAndSend("/log/" + folderToWatch, changedLog);
				}
				key.reset();
				key = watcher.take();
			}
		} catch (InterruptedException e) {
			logger.info("Stopping " + Thread.currentThread().getName() + " thread");
		}
	}
}
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38895701
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хмммм, и как я только что сам заметил - ловлю я ошибку не в том месте, там где я ее ловлю уже слишком поздно она туда не доходит... Как вы думаете если я ее буду ловить в run() - может что-то измениться?

Код: 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.
	public static Log createLog(File file, WatchState watchState) {

		Path path = Paths.get(file.getPath());
		BasicFileAttributes basicFileAttributes = null;
		Log log = null;
		try {
			basicFileAttributes = Files.getFileAttributeView(path, BasicFileAttributeView.class).readAttributes();

			log = new Log();
			log.setFileName(file.getName());
			log.setCreatedOn(new Date(basicFileAttributes.creationTime().toMillis()));
			log.setModyfiedOn(new Date(basicFileAttributes.lastModifiedTime().toMillis()));
			log.setSize(basicFileAttributes.size());
			log.setWatchState(watchState);
			log.setContent(new String(Files.readAllBytes(path)));
			logger.info("Created Log for file log: " + log.getFileName());

		} catch (Exception exception) {
			if (exception instanceof IOException) {
				logger.info("Cannot read a file " + log.getFileName() + " content or file attributes!");
			} else if (exception instanceof AccessDeniedException) {
				logger.info("The file " + log.getFileName() + " used by another process.");
			}
			exception.printStackTrace();
		}

		return log;
	}
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38895848
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,
- займи каким редактором тестовый файл (блокируй).
- натрави твой код
- обработай ошибку (пропусти файл) как можно раньше
И тестируй до опупения твой код чтобы сервер не падал.
В чём проблема?
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38896042
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123- займи каким редактором тестовый файл (блокируй). - не понял? Это не текстовый редактор, это nginx пишет в лог.

Petro123- натрави твой код
- обработай ошибку (пропусти файл) как можно раньше - WatchService - для этого и создан.

В чем проблема, я писал выше.
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38896141
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,
Проверка на занятость решается через исключалку и её обработку
- я имел ввиду, для проверки, воссоздать ситуацию занятости файла (любым способом)
- у тебя там только "хмммммм" - лови райзе и проверяй.
Удачи!
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38896173
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

Запускай под рутом! Тут уже интересно что будет, когда на каждое изменение access.log, куда-то отправляется весь файл log.setContent(new String(Files.readAllBytes(path)));.
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38896214
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FD_webdev_,

Запускай под рутом! Тут уже интересно что будет, когда на каждое изменение access.log, куда-то отправляется весь файл log.setContent(new String(Files.readAllBytes(path)));. - ))))) Это ж пока что разработка, на быструю руку сделано было. Хочу отправлять не все, а например за последний час. Да, сейчас грузятся мегабайты. ))))

На счет рута, то почему интересно сервис читает из tomcat and WildFly нормально, а из nginx нет? Сервис бегает на той же машинке.
...
Рейтинг: 0 / 0
Java - WatchService - проверка не занят ли файл другим процессом?
    #38896297
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_Спасибо, хмммм, насколько я посмотрел в watchService нет такого метода, а наблюдает за папко он.
Вот код.

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


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