JDBC LockRegistry через JVMS - PullRequest
       5

JDBC LockRegistry через JVMS

1 голос
/ 14 июня 2019

Служба приложений получает блокировку с помощью JDBC LockRepository, которая должна выполняться внутри @Transaction?

У нас есть пример службы приложений, которая обновляет JDBCRepository, и поскольку это приложение может работать на нескольких JVMS (без заголовка). Нам нужна глобальная блокировка для сериализации этих обновлений.

Я посмотрел твой тест и надеялся, что мой вариант использования тоже подойдет. ... JdbcLockRegistryDifferentClientTests

В моей конфигурации есть DefaultLockRepository и JdbcLockRegistry;

Я запустил (java -jar boot.jar) мое приложение на двух терминалах для симуляции. Когда я получаю блокировку и запускаю tryLock () без @Transaction для службы приложений, они оба получают блокировку (хотя и почти одну) за другой почти сразу. Я ожидал, что один из них НЕ получит его как минимум 10 секунд (истечение срока действия по умолчанию).

Service (Instance -1) {
  Obtain("KEY-1")
  tryLock()
  DoWork()
  unlock();
  close();
 }
Service (Instance -2) {
 Obtain("KEY-1")
 tryLock() <-- Wait until the lock expires or the unlock happens
 DoWork()
 unlock();
close();
 }

Я также заметил здесь DefaultLockRepository , что область транзакции (если не унаследована) относится только к операции JDBC.

Когда я меняю услугу на

 @Transaction
    Service (Instance -1) {
      Obtain("KEY-1")
      tryLock()
      DoWork()
      unlock();
      close();
     }

Работает как положено.

Я совершенно уверен, что что-то пропустил? Но я ожидаю, что моя операция блокировки будет учитывать глобальные блокировки (факт наличия блокировки в хранилище JDBC с истечением срока действия) до момента разблокировки или истечения срока действия.

Мое понимание неверно?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Это работает как задумано.Я неправильно настроил DefaultLockRepository, и ttl по умолчанию был короче, чем продолжительность блокировки моей службы (искусственное ожидание).Мои извенения.:) Джош Лонг помог мне понять это :)

0 голосов
/ 18 июня 2019

Вы должны использовать разные идентификаторы. То же самое означает, что тот же клиент. Это для особого случая использования. Используйте разные идентификаторы, так как они разные экземпляры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...