2010-04-19 3 views
0

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

Спасибо!

ответ

2

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

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

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

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

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

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

+1

Если они редактируют его через веб-страницу, а в файле xml есть объект домена, вы можете использовать атрибут version для опции 1;) –

+0

Привет, Тим, есть ли у вас хорошие ссылки об атрибуте версии? Был быстрый взгляд на Google и окончательное руководство к книге Grails, и это определенно звучит как хороший способ идентифицировать экземпляры одновременной модификации, но Wikipedia говорит (http: //en.wikipedia.org/wiki/Optimistic_concurrency_control), что это может быть не самый эффективный способ справиться с этим. Также проработанный пример будет удобен :-) – Armand

0

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

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

Такая глобальная область видимости HashMap миа ht хранится как атрибут в ServletContext. См. Также this.

+0

спасибо за входные парни! Я очень ценю это. –

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