2012-09-26 19 views
6

Estamos utilizando Hazelcast 2.3.1, en nuestro fichero de configuración hazelcast.xml que utilizamos escribir detrás de una Hazelcast IMap:Hazelcast Mapa bloqueado

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

Tenemos dos clases

  1. HazelcastObjectOperation que contiene el mapa y es utilizado para poner objetos en él.
  2. HazelcastObjectPersister que se extiende MapStore se usa para persistir Objetos cuando Hazelcast llama al 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(); 
     } 
    } 

El problema es cuando Hazelcast corre a través de este mapa y obtiene los objetos que deben ser almacenados en el método storeAll de la clase persister , el mapa está bloqueado para segundos y por lo que un puesto en este mapa dura esta vez. ¿Hay alguna solución para este problema?

Respuesta

3

Este fue un tema Hazelcast y fijada por: https://github.com/hazelcast/hazelcast/issues/293

Por cierto: Tenga en cuenta que siempre es mejor utilizar set() lugar put() si no se necesita el valor antiguo. El problema estaba relacionado con que put() intenta cargar el valor anterior si se define mapstore. set() no intenta cargar valores antiguos por lo que es más rápido y más limpio.