2015-07-09 6 views
1

У меня есть 2 разных сервера tomcat7, на каждом из которых развертывается одна и та же веб-служба. Каждый запрос веб-службы должен обновлять файл в общей flesystem (обычно NAS). Запись файла должна быть синхронизирована, чтобы избежать конфликта внутри JVM сервера tomcat, а также между JVM двух серверов. Я пробовал несколько способов:Синхронизация записи общего файла внутри JVM и через JVM

=> Синхронизированный блок для записи файлов работает только в одной JVM.

=> FileLock работает для каждой JVM, но не внутри JVM сервера (файл может быть заблокирован только один раз).

А как насчет использования файловой системы Java7 nio? это может мне помочь? Каков наилучший способ решить эту проблему?

PS: извините, если мой английский плохо ...

+0

Это похоже на «осмотрительный режим» журнала, см. Http://stackoverflow.com/q/7138838/3080094 – vanOekel

ответ

2

я могу думать о двух подходов:

  1. Использование synchronized (или Lock), а также FileLock; то есть сначала получить локальную блокировку на уникальном объекте, который обозначает канонизованный абсолютный путь, а затем получить FileLock.

  2. Использовать базу данных; например заблокируйте строку в таблице базы данных, которая имеет каноническое абсолютное имя пути как уникальный ключ.


А как насчет использования Java7 NiO файловой системы? это может мне помочь?

Нет. Проблема заключается в том, что блокировка файлов является функциональностью ОС, а поведение (не блокирование других потоков в одном процессе) является фундаментальной семантикой блокировки файлов ... в разных операционных системах.

Смежные вопросы