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

написал небольшой сервис на 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
05.03.2015, 08:40
    #38895398
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java - WatchService - проверка не занят ли файл другим процессом?
Ну, есть что-то вроде File.canRead().
...
Рейтинг: 0 / 0
05.03.2015, 11:29
    #38895653
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java - WatchService - проверка не занят ли файл другим процессом?
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
05.03.2015, 11:46
    #38895701
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java - WatchService - проверка не занят ли файл другим процессом?
Хмммм, и как я только что сам заметил - ловлю я ошибку не в том месте, там где я ее ловлю уже слишком поздно она туда не доходит... Как вы думаете если я ее буду ловить в 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
05.03.2015, 13:05
    #38895848
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java - WatchService - проверка не занят ли файл другим процессом?
_webdev_,
- займи каким редактором тестовый файл (блокируй).
- натрави твой код
- обработай ошибку (пропусти файл) как можно раньше
И тестируй до опупения твой код чтобы сервер не падал.
В чём проблема?
...
Рейтинг: 0 / 0
05.03.2015, 14:35
    #38896042
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java - WatchService - проверка не занят ли файл другим процессом?
Petro123- займи каким редактором тестовый файл (блокируй). - не понял? Это не текстовый редактор, это nginx пишет в лог.

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

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

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

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

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

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


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