Картата на Hazelcast е заключена

Използваме Hazelcast 2.3.1, в нашия конфигурационен файл hazelcast.xml използваме запис отзад за Hazelcast IMap:

 <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>

Имаме два класа

  1. HazelcastObjectOperation, който съдържа картата и се използва за поставяне на обекти в нея.
  2. HazelcastObjectPersister, което разширява MapStore, се използва за запазване на обекти, когато Hazelcast извиква 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();
    }
}

Проблемът е, че когато Hazelcast премине през тази карта и извлече обектите, които трябва да се съхраняват в метода storeAll на класа persister, картата се заключва за секунди и така поставянето в тази карта продължава това време. Има ли някакво решение за този проблем?


person luko    schedule 26.09.2012    source източник


Отговори (1)


Това беше проблем на Hazelcast и коригиран от: https://github.com/hazelcast/hazelcast/issues/293

Между другото: Имайте предвид, че винаги е по-добре да използвате set() вместо put(), ако не се нуждаете от старата стойност. Проблемът беше свързан с това, че put() се опитва да зареди стара стойност, ако е дефинирано mapstore. set() не се опитва да зареди стара стойност, така че е по-бързо и по-чисто.

person enesness    schedule 03.10.2012