Как смоделировать сценарий блокировки с помощью клиента Redisson? - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу создать сценарий, в котором я хочу смоделировать сценарий блокировки.Требование следующее: 1. В Redis есть экземпляр Map, имеющий пару Key, Value.2. Переберите ключи.3. Во время итерации проверяете, заблокировано ли значение, представленное ключом, кем-то другим?Если да, тогда переходите к следующему ключу.Если нет, то выполните обработку.

Итак, я написал ниже код для того же самого, но похоже, что нет индивидуальной блокировки для каждого объекта Карты, но он есть для всей Карты.Не могли бы вы помочь мне смоделировать сценарий?

RMap < String, SomeObject > someObjectMap = redissonClient.getMap("SOME_OBJECT_MAP");


someObjectMap.put("someObject1", new SomeObject());
someObjectMap.put("someObject2", new SomeObject());

Set < String > keySet = someObjectMap.keySet();

for (String key: keySet) {
 RLock lock = redissonClient.getLock("THE_LOCK");
 if (lock.tryLock()) {
  try {
   SomeObject someObject = someObjectMap.get(key);
   //do some processing on someObject instance.
   //I am assuming that if there is any other lock on someObject then I will skip and proceed to the next one in the Map.
  } finally {
   lock.unlock();
  }
 } else {
  continue;
 }
}

Чтобы убедиться, что мой код работает, я написал ниже тестовый код.Но когда я выполняю его, он блокирует не один экземпляр карты, а саму карту.Как видно из приведенного ниже кода, объект, связанный с ключом "someObject1", обрабатывается, но все же, когда вы просматриваете вышеприведенный код для объекта с ключом "someObject2", он также пропускается.

RMap < String, SomeObject > someObjectMap = redissonClient.getMap("SOME_OBJECT_MAP");

Thread t = new Thread(() -> {
 SomeObject someObject = someObjectMap.get("someObject1");
 RLock lock = redissonClient.getLock("SOME_LOCK");
 try {
  lock.lock();
  while (true) {
   //do processing with someObject 
  }
 } finally {
  lock.unlock();
 }
});
t.start();

Пожалуйста, предложите.

...