2014-12-01 1 views
10

У аэрокосмического клиента есть метод scanAll для чтения всех строк из его магазина. Я использую его в ниже код:Aerospike: как я могу получить ключ для записи?

ScanPolicy policy = new ScanPolicy(); 
policy.concurrentNodes = true; 
policy.priority = Priority.DEFAULT; 
policy.includeBinData = true; 
policy.scanPercent = 100; 

client.scanAll(policy, "namespaceName", "setName", new ScanCallback() { 
    @Override 
    public void scanCallback(Key key, Record record) throws AerospikeException { 
     STORE.put(key.userKey.toLong(), record.getValue("binName").toString()); 
    } 
}); 

Но он закончил с NullPointerException, потому что userKey равна нулю. Все остальные поля действительны, как ожидалось. Ключ Пользователь Долгий значение, которое было использовано для сохранения данных:

client.put(writePolicy, new Key("namespaceName", "setName", userKey), new Bin("binName", value)); 

Все это хорошо, если я один запрос, как это:

client.get(readPolicy, new Key("namespaceName", "setName", userKey)); 

Что может быть не так? Почему userKey имеет значение NULL?

ответ

15

Aerospike использует ключ и заданное имя для создания уникального дайджеста, поэтому он хранит только дайджест.

При установке одной записи, если вы установили writePolicy.sendKey = true, тогда ключ будет сохранен как метаданные записи. Если одна запись вставлена ​​с writePolicy.sendKey = true, тогда вы получите ключ в scanCallback().

По умолчанию writePolicy.sendKey является ложным, поэтому по умолчанию scanCallback() получает null как ключ. Вот почему ваш key.userKey.toLong() дает NullPointerException.

+1

Большое спасибо за ваше время и хороший ответ! – DmitryKanunnikoff

3

Я тоже столкнулся с этой проблемой даже во время написания мы устанавливали WritePolicy.sendkeys = true.

После 2-3 дней отладки выяснилось, что была проблема с версией аэрокосмического клиента. Первоначально я использовал 3.0.25, но после обновления до 3.0.35 он начал нормально работать.