Карта 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