Множественный доступ к файлам в Groovy (Groovy на Grails) - PullRequest
0 голосов
/ 19 апреля 2010

У меня есть приложение, которое позволяет нескольким пользователям получать доступ к 1 XML-файлу. Проблема в том, что когда все пользователи сохраняют одновременно, другие изменения других пользователей не сохраняются. Как определить, находится ли файл у пользователя в groovy?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

Эта проблема не имеет ничего общего с groovy / grails, но является фундаментальной проблемой одновременного изменения файла. Вы должны решать эту проблему так же, как система контроля исходного кода (SCCS), например SVN или CVS.

В частности, сохраните время последнего изменения файла. Это может быть сохранено в самом файле, в метаданных файла или в другом файле, который предоставляется каждый раз при загрузке файла XML. Когда пользователь загружает файл, проверьте, не был ли он изменен (другим пользователем) с момента получения копии. Если это так, у вас есть несколько вариантов:

  • Дайте ему самую последнюю копию и скажите, чтобы он сам слил изменения (это то, что сделает дрянная SCCS)
  • Попробуйте и автоматически объедините изменения, если они не конфликтуют (это то, что сделает лучший SCCS). В случае возникновения конфликтов пользователь должен будет разрешить их вручную.

Один из подходов (который может быть излишним) заключается в том, чтобы фактически использовать SCCS для решения этой проблемы управления версиями. Существует Java API для CVS (и, вероятно, для других SCCS), который позволяет программно регистрировать, извлекать и объединять файл.

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

Обновление: Некоторая информация о свойстве version, которое один из упомянутых комментаторов имеет в разделах 5.3.5 и 5.5.2.7 справочного руководства Grails

0 голосов
/ 19 апреля 2010

Другой подход: поддерживать глобальную хэш-карту с областью действия, содержащую файл -> пользовательские сопоставления (или просто список файлов, если неважно, какой пользователь заблокировал файл). Если пользователь пытается открыть файл:

  1. проверить, содержится ли этот файл на карте
  2. если это так, отклоните попытку и выполните некоторую обработку ошибок
  3. если нет, добавьте запись на карту
  4. откройте файл и сделайте работу
  5. после сохранения файла соответствующая запись должна быть удалена с карты

Такая глобальная хэш-карта с областью действия может храниться как атрибут в ServletContext . Смотри также это .

...