You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hazelcast客户端-服务端部署中ClassNotFoundException问题排查

问题:Hazelcast客户端-服务端模式下ClassNotFoundException触发场景与根源分析

环境与架构

  • Kubernetes环境中的Spring Boot应用,采用Hazelcast客户端-服务端部署模式
  • 核心缓存依赖:Spring缓存注解、Hibernate二级缓存,部分场景通过Hazelcast实例手动执行缓存读写

缓存Map配置(已为key添加排序索引)

val userOrderConfig = MapConfig(Caches.USER_ORDERS)
userOrderConfig.apply {
    this.evictionConfig = EvictionConfig().setEvictionPolicy(EvictionPolicy.LRU).apply {
        this.maxSizePolicy = MaxSizePolicy.PER_NODE
        this.size = 10000
    }
    this.timeToLiveSeconds = (30*60)
}

userOrderConfig.addIndexConfig(IndexConfig(IndexType.SORTED, "__key"))
hzInstance.config.addMapConfig(userOrderConfig)

缓存读写示例代码

val map = hz.getMap<String, List<UserOrder>>(Caches.USER_ORDERS)
val key = "${userId}-${otherParameter}"
val result = map[key]

if (result != null)
    result
else {
    // 业务逻辑处理
    map.put(key, result)
    return result
}

缓存清理代码

fun clearUserOrderCache(userId: Int){
    val key = "${userId}"
    thread {
        try {
            val map = hz.getMap<String, List<UserOrder>>(Caches.USER_ORDERS)
            map.removeAll(Predicates.like<String, List<UserOrder>>("__key", "$key-%"))
        } catch (ex: Exception) {
            ex.printStackTrace()
        }
    }
}

问题现象

此前代码运行完全正常,缓存的更新、读取、清理逻辑均符合预期;但在未修改任何代码的情况下,val result = map[key]操作突然抛出异常,异常根因为:

java.lang.ClassNotFoundException: com.example.app.models.dtos.UserOrder

初步分析

推测触发路径为:Hazelcast服务端执行GetOperation时,会检查目标缓存记录是否过期;若记录过期,服务端会执行驱逐操作并移除对应索引;而在索引移除过程中,需要反序列化缓存值,但服务端类路径中不存在UserOrder类,因此抛出ClassNotFoundException。

核心疑问

已掌握若干可行的解决办法,现需明确:

  • 该异常场景的触发条件
  • 此类类路径不一致问题的根源

内容的提问来源于stack exchange,提问作者jetro157

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:23:20