2017-09-08 3 views
0

J'ai un programme en cluster où chaque thread veut verrouiller un ensemble de clés. Comme je l'ai compris en utilisant la solution la plus simple Hazelcast:Hazelcast IMap tryLock touches multiples en bloc

private void lock(SortedSet<String> objects) { 
    try { 
     IMap<String, String> lockMap = getLockMap(); 
     for (; ;) { 
      SortedSet<String> lockedObjects = new TreeSet<>(); 
      for (String object : objects) { 
       try { 
        boolean locked = lockMap.tryLock(object, 0, null, maxBlockTime, TimeUnit.MILLISECONDS); 
        if (locked) { 
         lockedObjects.add(object); 
        } else { 
          for (String lockedObject : lockedObjects) { 
           lockMap.unlock(lockedObject); 
          } 
          lockedObjects.clear(); 
          break; 
        } 
       } catch (Exception e) { 
        for (String lockedObject : lockedObjects) { 
         try { 
          lockMap.unlock(lockedObject); 
         } catch(Exception ignored) { 
         } 
        } 
        throw e; 
       } 
      } 

      if (!lockedObjects.isEmpty()) { 
        return lockedObjects; 
      } 

      Thread.sleep(waitTime); 
     } 
    } 
} 

Le principal problème de ce code que ce code génère beaucoup de réseau et trafique demandes de Hazelcast. Quelqu'un pourrait-il recommander comment ce code peut être optimisé?

Je n'ai pas trouvé la fonctionnalité tryLock en vrac dans le Hazelcast IMap.

Répondre

0

Hazelcast n'offre pas de méthode bulkLock.

Vous pouvez optimiser ce code de plusieurs façons, mais avant d'en arriver là, il serait bon de savoir pourquoi vous voulez verrouiller ces entrées et ce que vous essayez d'obtenir.