簡體   English   中英

Hazelcast-java.lang.IllegalArgumentException:鍵不能為Data類型

[英]Hazelcast - java.lang.IllegalArgumentException: key cannot be of type Data

我們剛剛將我們的應用程序從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);

設置字符串的代碼行之間沒有任何內容

String key = getKey(blah, blah);

和吹線:(

遵循源代碼,TransactionalMapProxySupport的方法“ toNearCacheKeyWithStrategy”具有以下邏輯:

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

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

然后,“ DefaultNearCache”對象執行

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

因此,看起來名為“ serializeKeyes”的“ TransactionalMapProxySupport”屬性必須為FALSE,但“ DefaultNearCache”中的同名屬性必須為true :(

git中“ DefaultNearCache”的歷史記錄表明該代碼在一年前已更改,並顯示以下消息:“將近緩存的序列化鍵默認值從true更改為false”

我應該設置一些配置嗎?

我在地圖上的配置很簡單:

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

啊! 看來我可以將(true | false)的“ serialize-keys”標簽添加到此xml並設置值。

看來,Hazelcast代碼庫的不同位為“序列化鍵”假定了不同的默認值。 要么它是配置中的必需元素,要么默認值在各處都相同,是嗎?

提到的行為確實是Hazelcast中的錯誤。 我為此創建了一個新的GitHub問題,因此我們可以正確處理它-hazelcast / hazelcast#13371

受該錯誤影響的版本的解決方法是,在near-cache配置中將serialize-keys設置為true false值在這里無濟於事。

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

彼得,感謝您的報告和出色的調查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM