Hazelcast - java.lang.IllegalArgumentException: ключ не может иметь тип данных - PullRequest
0 голосов
/ 12 июня 2018

Мы только что обновили наше приложение с Hazelcast 3.8.0 до 3.10.1.

Мы получаем сообщение об ошибке "ключ не может быть типа данных!"при доступе к данным в Hazelcast.

java.lang.IllegalArgumentException: key cannot be of type Data!
at com.hazelcast.util.Preconditions.checkNotInstanceOf(Preconditions.java:300)
at com.hazelcast.internal.nearcache.impl.DefaultNearCache.checkKeyFormat(DefaultNearCache.java:226)
at com.hazelcast.internal.nearcache.impl.DefaultNearCache.get(DefaultNearCache.java:114)
at com.hazelcast.map.impl.tx.TransactionalMapProxySupport.getCachedValue(TransactionalMapProxySupport.java:183)
at com.hazelcast.map.impl.tx.TransactionalMapProxySupport.getInternal(TransactionalMapProxySupport.java:132)
at com.hazelcast.map.impl.tx.TransactionalMapProxy.get(TransactionalMapProxy.java:110)
at com.hazelcast.client.impl.protocol.task.transactionalmap.TransactionalMapGetMessageTask.innerCall(TransactionalMapGetMessageTask.java:43)
at com.hazelcast.client.impl.protocol.task.AbstractTransactionalMessageTask.call(AbstractTransactionalMessageTask.java:34)
at com.hazelcast.client.impl.protocol.task.AbstractCallableMessageTask.processMessage(AbstractCallableMessageTask.java:35)
at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.initializeAndProcessMessage(AbstractMessageTask.java:130)
at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.run(AbstractMessageTask.java:110)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)
at ------ submitted from ------.(Unknown Source)

Я на 100% уверен, что используемый нами «ключ» - это строка.Фрагмент кода выглядит следующим образом:

 String key = getKey(blah, blah);

 TransactionContext context = client.newTransactionContext();
 context.beginTransaction();
 TransactionalMap<String, AppPrefs> dataMap = context.getMap(MAP_NAME);
 try {
        prefs = dataMap.get(key);
        context.commitTransaction();

     } catch (Throwable t) {
        LOGGER.error("Error getting AppPrefs.", t);
        context.rollbackTransaction();
     }

Строка кода, выдающая ошибку:

prefs = dataMap.get(key);

Между строкой кода, которая устанавливает строку

*, нет ничего1013 *

и строка, которая дует: (

Следуя исходному коду, метод TransactionalMapProxySupport "toNearCacheKeyWithStrategy" имеет такую ​​логику:

final Object toNearCacheKeyWithStrategy(Object key) {
    if (!nearCacheEnabled) {
        return key;
    }

    return serializeKeys ? ss.toData(key, partitionStrategy) : key;
}

Затем объект "DefaultNearCache" выполняетa

private void checkKeyFormat(K key) {
    if (!serializeKeys) {
        checkNotInstanceOf(Data.class, key, "key cannot be of type Data!");
    }
}

Таким образом, похоже, что свойство TransactionalMapProxySupport, называемое serializeKeyes, должно быть FALSE, но свойство с тем же именем в DefaultNearCache должно быть истинным: (

История «DefaultNearCache» в git показывает, что год назад код был изменен с сообщением: «Изменены значения по умолчанию для ключей serialize для Near Cache с true на false»

Есть ли какая-то конфигурация, которую я должен установить?

Конфигурация, которую я имею для карты, просто:

<near-cache name="AppPrefsCache">
  <!-- Cache locally for 10 mins -->
  <max-idle-seconds>600</max-idle-seconds>
</near-cache>

Ах! Похоже, я могу добавить тег "serialize-keys" (true | false)в этот xml и установите значение.

Похоже, что разные биты кодовой базы Hazelcast принимают другое значение по умолчанию для "serialize-keys".Либо это должен быть обязательный элемент в конфиге, либо значение по умолчанию должно быть одинаковым везде, да?

1 Ответ

0 голосов
/ 27 июня 2018

Указанное поведение действительно является ошибкой в ​​Hazelcast.Я создал для него новую проблему GitHub, поэтому мы можем правильно ее обработать - hazelcast / hazelcast # 13371 .

Обходной путь для версий, затронутых этой ошибкой, - установить serialize-keysдо true в конфигурации near-cache.Значение false здесь не поможет.

Config config = new Config();
config.getMapConfig(testName)
    .setNearCacheConfig(new NearCacheConfig().setSerializeKeys(true));

Спасибо за отчет и большое исследование, Питер.

...