2015-08-08 2 views
0

Получил started looking at Hazelcast (3.4.4). Минимальная конфигурация. Тест:Hazelcast get всегда возвращает null, containsKey всегда возвращает 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) 

Почемуnull, почему false, почему только map.getAsync(19).get() работает?

Это, однако:

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

Напечатает все записи.

Update:

в конфигурации:

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

ответ

4

Он работает, как ожидалось при изменении var value1 = map.get(19) в var value1 = map.get(19l)

Вы используете Long в качестве ключей при хранении данных в карту. Однако вы используете Integer для возврата данных. Как видно из IMAP contract, сравнение равенства использует двоичную (сериализованную) форму ключа, а не самого ключа. Очевидно, что длинный сериализуется в другой двоичный код, чем целое.

getAsync() работает в отличие от метода get(), он использует дженерики, и я предполагаю, что компилятор Scala преобразует ключ в длинный позади сцены.

Это комбинация автоматического бокса и волшебства компилятора Scala, создающего, казалось бы, непоследовательное поведение. Однако, когда я думаю об этом, это не так неожиданно. Поведение j.u.Map точно такое же. Следующие испытания также не удались:

@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

Nice catch .. Thanks. – ses

Смежные вопросы