【问题标题】:ClassCastException with Stacktrace Hazelcast version 4.2.5 using ReplicatedMap使用 ReplicatedMap 的 Stacktrace Hazelcast 版本 4.2.5 的 ClassCastException
【发布时间】:2022-11-04 07:55:32
【问题描述】:

在 Kubernetes 上的 Tomcat 上部署的 web 应用中使用 Hazelcast 4.2.5 版。我们经常(“每 5 秒”)在应用程序日志中看到带有堆栈跟踪的 ClassCastException。

这是 ClassCastException :

java.lang.ClassCastException: class java.lang.String cannot be cast to class com.hazelcast.internal.serialization.impl.HeapData (java.lang.String is in module java.base of loader 'bootstrap'; com.hazelcast.internal.serialization.impl.HeapData is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @2f04993d)
27-Oct-2022 22:57:56.357 WARNING [hz.rogueUsers.cached.thread-2] com.hazelcast.internal.metrics.impl.MetricsCollectionCycle.null Collecting metrics from source com.hazelcast.replicatedmap.impl.ReplicatedMapService failed
        at com.hazelcast.internal.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:102)
        at com.hazelcast.internal.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76)
        at java.base/java.lang.Thread.run(Thread.java:834)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at com.hazelcast.internal.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:217)
        at com.hazelcast.spi.impl.executionservice.impl.DelegateAndSkipOnConcurrentExecutionDecorator$DelegateDecorator.run(DelegateAndSkipOnConcurrentExecutionDecorator.java:77)
        at com.hazelcast.internal.metrics.impl.MetricsService.collectMetrics(MetricsService.java:154)
        at com.hazelcast.internal.metrics.impl.MetricsService.collectMetrics(MetricsService.java:160)
        at com.hazelcast.internal.metrics.impl.MetricsRegistryImpl.collect(MetricsRegistryImpl.java:316)
        at com.hazelcast.internal.metrics.impl.MetricsCollectionCycle.collectDynamicMetrics(MetricsCollectionCycle.java:88)
        at com.hazelcast.replicatedmap.impl.ReplicatedMapService.provideDynamicMetrics(ReplicatedMapService.java:387)
        at com.hazelcast.replicatedmap.impl.ReplicatedMapService.getStats(ReplicatedMapService.java:357)
        at com.hazelcast.replicatedmap.impl.ReplicatedMapService.getLocalReplicatedMapStats(ReplicatedMapService.java:197)
        at com.hazelcast.replicatedmap.impl.LocalReplicatedMapStatsProvider.getLocalReplicatedMapStats(LocalReplicatedMapStatsProvider.java:85)

这是我们如何设置 Hazelcast。

    private static HazelcastInstance setupHazelcastConfig() {
        Config config = new Config();
        config.setInstanceName("rogueUsers");
        NetworkConfig network = config.getNetworkConfig();
        network.setPort(5701).setPortCount(20);
        network.setPortAutoIncrement(true);
        JoinConfig join = network.getJoin();
        join.getMulticastConfig().setEnabled(true);
//        join.getTcpIpConfig()
//        .setEnabled(true);

        HazelcastInstance hz = Hazelcast.getOrCreateHazelcastInstance(config);

        ReplicatedMapConfig replicatedMapConfig =
                config.getReplicatedMapConfig("rogueUsers");

        replicatedMapConfig.setInMemoryFormat(InMemoryFormat.BINARY);
        replicatedMapConfig.setAsyncFillup(true);
        replicatedMapConfig.setStatisticsEnabled(true);
        replicatedMapConfig.setSplitBrainProtectionName("splitbrainprotection-name");

        ReplicatedMap<String, String> map = hz.getReplicatedMap("rogueUsers");
        map.addEntryListener(new RogueEntryListener());

        return hz;
    }

这是配置问题吗?
我该如何解决 ?

非常感谢,

【问题讨论】:

  • 请使用“由”添加完整的堆栈跟踪。
  • @hunter:不幸的是,日志只要包含就这么多。它每 5 秒重复一次相同的文本块。它没有任何原因。

标签: java exception hazelcast classcastexception


【解决方案1】:

从以下行引发异常:

if (isBinary) {
  memoryUsage += ((HeapData) record.getValueInternal()).getHeapCost(); <-- exception
}

这是com.hazelcast.replicatedmap.impl.LocalReplicatedMapStats 类的第 85 行。检查的条件如下:

boolean isBinary = (replicatedMapConfig.getInMemoryFormat() == InMemoryFormat.BINARY);

所以基本上,它与您保存数据的格式有关(从上面的配置中您选择了 BINARY)。

但是,我认为您没有正确遵循它,因为您执行了以下操作:ReplicatedMap&lt;String, String&gt; map = hz.getReplicatedMap("rogueUsers"); 在您的配置中。

来自com.hazelcast.internal.serialization.Data 类的Javadoc:

数据是序列化的基本单位。它存储由 SerializationService.toData(Object) 序列化的对象的二进制形式。

因此,尝试将您的配置编辑为:

ReplicatedMap<Data, Data> map = hz.getReplicatedMap("rogueUsers");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2018-10-20
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多