2015-08-08 1 views
0

Got started looking at Hazelcast (3.4.4). Configuration minimale. Test:Hazelcast get always renvoie null, containsKey retourne toujours false

case class Ticket(id:Int, name:String) 

val ticketCount = 20 
     val tickets:List[Ticket] = for { n <- (0 until ticketCount).toList } yield Ticket(n, s"ticket$n") 

val map: IMap[Long, Ticket] = hz1.getMap[Long,Ticket]("com.foo.testmap") 

tickets foreach { t => 
    println(s"submitting $t") 
    Thread.sleep(10) // some delay to submit one ticket 
    map.putIfAbsent(t.id, t) 
} 


Thread.sleep(2000) // two seconds to make sure all is set.. 


var value1 = map.get(19)    // null 

var value2 = map.containsKey(19)) // false 

val value3 = map.getAsync(19).get() // Ticket(19,ticket19) 

Pourquoinull, pourquoi false, pourquoi seulement map.getAsync(19).get() œuvres?

Ceci, cependant:

val iterator = map.entrySet().iterator()  // will print all values 
    while(iterator.hasNext) { 
    val next = iterator.next() 
    println(next) 
    } 

imprime toutes les entrées.

Mise à jour:

dans config:

<map name="com.foo.testmap"> 
    <in-memory-format>OBJECT</in-memory-format> 
</map> 

Répondre

4

Il fonctionne comme prévu lorsque vous changez var value1 = map.get(19) à var value1 = map.get(19l)

Vous utilisez longtemps que les clés lors de l'enregistrement des données dans une carte. Cependant, vous utilisez Integer pour récupérer les données. Comme vous pouvez le voir dans le IMap contract la comparaison d'égalité utilise la forme binaire (sérialisée) de la clé, pas la clé elle-même. Évidemment, un long est sérialisé en un binaire différent de l'entier. Le getAsync() fonctionne comme contrairement à la méthode get() il utilise des génériques et je suppose que le compilateur Scala convertit la clé en un long derrière la scène.

C'est une combinaison de la boxe automatique et de la sorcellerie du compilateur Scala créant un comportement apparemment incohérent. Cependant, quand j'y pense, ce n'est pas vraiment inattendu. Comportement de j.u.Map est exactement le même. Le test suivant échoue également:

@Test 
public void surpriseNotReally() { 
    Map<Long, String> map = new HashMap<>(); 

    long key = 1; 
    String expectedValue = "foo"; 
    map.put(key, expectedValue); 

    String actualValue = map.get(1); 
    assertEquals(expectedValue, actualValue); 
} 
+0

Belle prise .. Merci. – ses