Мы только что обновили наше приложение с 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".Либо это должен быть обязательный элемент в конфиге, либо значение по умолчанию должно быть одинаковым везде, да?