Size: a a a

2021 May 04

М

Михаил in pro.jvm
а есть метод по проверке залочен ключ или нет?
источник

WD

Web Dev in pro.jvm
к сожалению нет

видел лишь намек на это вот так

if (hazelcastMap.get(key) instanceof ILock) {

}

но это даже условие не выполняется корректно, к сожалению
источник

WD

Web Dev in pro.jvm
показываю как ложу ключ, как блокирую


       key = "testkey";
       hazelcastMap.put(key, "1");

       hazelcastMap.lock(key);
источник

М

Михаил in pro.jvm
https://docs.hazelcast.org/docs/4.0.2/javadoc/com/hazelcast/map/IMap.html

boolean  isLocked(K key)
Checks the lock for the specified key.
источник

WD

Web Dev in pro.jvm
проверю, напишу
источник

WD

Web Dev in pro.jvm
       if(hazelcastMap.isLocked(key)){
           System.out.println("ключ заблокирован");
       }else{
           System.out.println("ключ НЕ заблокирован");
       }
источник

WD

Web Dev in pro.jvm
работает!
источник

WD

Web Dev in pro.jvm
получается теперь мне нужно написать метод, если заблокирован, то вызвать следующий ключ?

мне кажется с миллионами записей будет проблема, если так сделать
источник

М

Михаил in pro.jvm
keySet.stream().filter(e-> !map.isLocked(e)).findFirst()
источник

М

Михаил in pro.jvm
я не работал с хазелкастом
но вижу есть метод - https://docs.hazelcast.org/docs/4.0.2/javadoc/com/hazelcast/map/IMap.html#getQueryCache-java.lang.String-com.hazelcast.query.Predicate-boolean-
мб попробовать сюда передать предикат в котором будешь проверять что ключ не заблочен и что нужен 1 элемент?
источник

WD

Web Dev in pro.jvm
я так понял это вроде запроса sql)) понятно что даже близко не оно, но смысл понял - а что идея хорошая, изучу детальнее
источник

WD

Web Dev in pro.jvm
спасибо!
источник

М

Михаил in pro.jvm
напиши потом, к какому решению придешь
источник

WD

Web Dev in pro.jvm
обязательно
источник

WD

Web Dev in pro.jvm
не смог разобраться как применить для лока (
источник

WD

Web Dev in pro.jvm
такую жесть написал, хочется получше что-то..



public class Helpers {
   public Map.Entry<Object, Object> getNextNoLockKey(HazelcastInstance hazelcastInstance, IMap hazelcastMap){
       Map.Entry<Object, Object> entry = hazelcastInstance.getMap("work-map").entrySet().iterator().next();

       if(hazelcastMap.isLocked(entry.getKey())){
           System.out.println("ключ заблокирован");
           return getNextNoLockKey(hazelcastInstance, hazelcastMap);
       }else{
           System.out.println("ключ НЕ заблокирован");
           return entry;
       }
   }
}
источник

V

Vlad in pro.jvm
а то, что Михаил написал, чем не подходит?
зачем тут рекурсию делать?

keySet.stream().filter(e-> !map.isLocked(e)).findFirst()
источник

WD

Web Dev in pro.jvm
пробую как Вы сказали

public class Helpers {
   public static String getNextNoLockKey(IMap hazelcastMap){
       return hazelcastMap.keySet().stream().filter(e-> !hazelcastMap.isLocked(e)).findFirst().toString();
   }
}
источник

WD

Web Dev in pro.jvm
сработало, но только при условии что текущий поток заблокировал опрделенные ключи, а вот если другие потоки ключи заблокировали, тогда текщий поток даже не способен проверить на  isLock

 "message": "Current thread is not owner of the lock! -> <not-locked>",

Видимо мне нужен другой подход
источник

WD

Web Dev in pro.jvm
мне нравится подход Михаила, но реализовать технически не смог его с локами
источник