2012-09-26 4 views
6

Wir verwenden 2.3.1 Hazelcast, in unserer hazelcast.xml Konfigurationsdatei hinterlassen wir einen Hazelcast IMap schreiben verwenden:Hazelcast Karte ist gesperrt

<map name="HazelcastObjectOperations.objectMap"> 
     <backup-count>1</backup-count> 
     <map-store enabled="true"> 
      <class-name>persister.HazelcastObjectPersister</class-name> 
      <write-delay-seconds>10</write-delay-seconds> 
     </map-store> 
</map> 
<properties> 
     <property name="hazelcast.map.cleanup.delay.seconds">5</property> 
</properties> 

Wir haben zwei Klassen

  1. HazelcastObjectOperation die die Karte enthält und verwendet, um Objekte darin zu platzieren.
  2. HazelcastObjectPersister die erweitert wird MapStore wird verwendet , um Objekte zu erhalten, wenn Hazelcast ruft storeAll().
public class HazelcastObjectOperation 
    { 

     protected final IMap<Long, MyHzcObj> objectMap; 
     private final HazelcastInstance instance; 

     public HazelcastObjectOperation() 
     { 
      this.instance = Hazelcast.getDefaultInstance(); 
      this.objectMap = this.instance.getMap(
           "HazelcastObjectOperations.objectMap"); 
     } 

     public void save(final MyHzcObj object) 
     { 
      long start = System.currentTimeMillis(); 
      IdGenerator generator = Hazelcast.getIdGenerator("generator"); 
      this.objectMap.put(generator.newId(), object); 
      long end = System.currentTimeMillis(); 
     } 
    } 

Das Problem ist, wenn Hazelcast durch diese Karte läuft und holt die Objekte, die in dem storeAll Verfahren der persister Klasse gespeichert werden soll, wird die Karte für Sekunden gesperrt und so ein put in diese Karte dauert diesmal . Gibt es eine Lösung für dieses Problem?

Antwort

3

Das war ein Problem und Hazelcast fixiert: https://github.com/hazelcast/hazelcast/issues/293

By the way: Beachten Sie, dass es immer besser ist set() statt put() zu verwenden, wenn Sie den alten Wert nicht brauchen. Das Problem wurde damit verbunden put() versucht, alten Wert zu laden, wenn Mapstore definiert ist. set() versucht nicht, alten Wert zu laden, damit es schneller und sauberer ist.