ClassCastException 与 Stacktrace Hazelcast 版本 4.2.5 使用 ReplicatedMap

anj*_*anb 6 java exception classcastexception hazelcast

在部署在 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)
Run Code Online (Sandbox Code Playgroud)

以下是我们如何设置 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

非常感谢,

小智 0

异常是从以下行抛出的:

if (isBinary) {
  memoryUsage += ((HeapData) record.getValueInternal()).getHeapCost(); <-- exception
}
Run Code Online (Sandbox Code Playgroud)

这是com.hazelcast.replicatedmap.impl.LocalReplicatedMapStats班级的85号线。被检查的条件如下:

boolean isBinary = (replicatedMapConfig.getInMemoryFormat() == InMemoryFormat.BINARY);
Run Code Online (Sandbox Code Playgroud)

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

但是,我认为您没有正确遵循它,因为您执行了以下操作:ReplicatedMap<String, String> map = hz.getReplicatedMap("rogueUsers");在 config.json 中。

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

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

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

boolean isBinary = (replicatedMapConfig.getInMemoryFormat() == InMemoryFormat.BINARY);
Run Code Online (Sandbox Code Playgroud)