Я некоторое время изучал, как решить эту проблему, но, похоже, не могу найти правильного решения.
Вот проблема:
У меня есть приложение Java EE, где многиепользователи могут входить в систему, им предоставляется список элементов, и они могут выбирать и редактировать любой из них.
Все пользователи видят один и тот же список элементов.Как уже упоминалось, они могут редактировать элемент, но я бы хотел ограничить функцию редактирования одним пользователем.То есть многие пользователи могут редактировать разные элементы одновременно, но только один пользователь может редактировать конкретный элемент.
Когда один пользователь редактирует элемент, любому другому пользователю, пытающемуся редактировать этот элемент, должно появиться сообщение.
Я реализовал это, установив флаг для элемента inUse в значение true, а затем проверил это.Когда пользователь завершит редактирование элемента, нажав кнопку «Сохранить» или «Отмена», для флага будет установлено значение false.Проблема этого подхода заключается в учете случаев, когда пользователь оставляет свой браузер открытым или браузер закрыт.
Я попытался установить тайм-аут сеанса, но не могу заставить его работать, потому что по истечении времени сеанса у меня нет доступа к этому элементу.У меня есть доступ только к идентификатору сеанса httprequest.
Возможно, это неправильный подход, поскольку кажется, что это проблемы, с которыми сталкиваются многие приложения, и должно существовать менее хакерское решение.
Я посмотрел наиспользуя потоки и синхронизированные методы, но не знаю, как это будет работать, потому что, как только пользователь входит в экран элемента редактирования, метод выходит и снимает блокировку.
Я нашел это решение Разрешен только один пользовательредактировать контент за один раз , но не уверен, так ли это на Java.
Есть ли более элегантное решение / Java?Если да, можете ли вы указать мне правильное направление, пожалуйста?Как бы вы это реализовали?
Спасибо!
Решение: Хотя изначально я думал, что оптимистичная блокировка - это путь, я быстро понял, что она действительно не будет работать для моей среды.Я решил использовать комбинацию пессимистической блокировки (http://www.agiledata.org/essays/concurrencyControl.html#PessimisticLocking) и тайм-аутов.
Когда к элементу обращаются, я устанавливаю для поля inUse значение true, а для последнего доступного поля объекта - текущее время.
Каждый раз, когда кто-то пытается отредактировать объект, я проверяю поле inUse и поле lastAccessed + 5 минут, поэтому в основном я даю 5 минут на редактирование пользователя.