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

Apache Ignite对等类加载启用仍报ClassNotFoundException问题排查

Apache Ignite 2.17.0 对等类加载下ClassNotFoundException问题排查

环境与需求

  • 使用Apache Ignite 2.17.0版本
  • 客户端已启用对等类加载,创建临时缓存
  • 运行单个服务端节点
  • 需求:从客户端执行继承SplitComputeTaskAdapter的计算任务,对缓存执行扫描查询

错误日志

Caused by: java.lang.ClassNotFoundException: com.ignite.proxy.spring.jpa.pojo.Abc
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[na:na]
    at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
    at java.base/java.lang.Class.forName(Class.java:398) ~[na:na]
    at org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:9348) ~[ignite-core-2.17.0.jar:2.17.0]
    at org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:9286) ~[ignite-core-2.17.0.jar:2.17.0]
    at org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:397) ~[ignite-core-2.17.0.jar:2.17.0]
    at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:717) ~[ignite-core-2.17.0.jar:2.17.0]
    ... 28 common frames omitted

当前配置

对等类加载

  • 客户端与服务端均设置peerClassLoadingEnabled = true

服务端二进制配置

BinaryConfiguration binCfg = new BinaryConfiguration();
binCfg.setNameMapper(new BinaryBasicNameMapper().setSimpleName(true));
binCfg.setIdMapper(new BinaryBasicIdMapper());

客户端二进制配置

BinaryConfiguration binCfg = new BinaryConfiguration();
binCfg.setNameMapper(new BinaryBasicNameMapper().setSimpleName(true));
binCfg.setIdMapper(new BinaryBasicIdMapper());

已尝试操作

  • 验证客户端与服务端均启用对等类加载
  • 确保计算任务已部署在客户端
  • 确认com.ignite.proxy.spring.jpa.pojo.Abc类存在于客户端项目且可访问
  • 确认客户端与服务端的二进制序列化配置一致

问题

为何启用对等类加载后仍出现ClassNotFoundException?如何确保计算任务及相关类在服务端执行时能被正确加载?


分析与解决方案

1. 对等类加载触发时机限制

对等类加载默认仅在任务部署、任务参数传递阶段触发类传输。如果Abc类是服务端执行缓存扫描时才需要反序列化,但该类既未在服务端存在,也未通过任务参数/任务类关联传递,就会加载失败。

  • 解决:
    • 在计算任务类中显式引用Abc类(比如添加Class<Abc> cls = Abc.class;代码),让Ignite部署任务时自动传输该类;
    • 提交任务时将Abc.class作为任务参数传递,触发对等类加载机制传输该类。

2. 临时缓存的类加载隔离

临时缓存的类加载上下文可能未覆盖对等类加载,导致扫描查询反序列化时找不到类。

  • 解决:在客户端和服务端的BinaryConfiguration中显式注册Abc类:
    import java.util.Collections;
    // ...
    binCfg.setClasses(Collections.singletonList(com.ignite.proxy.spring.jpa.pojo.Abc.class));
    
    让Ignite提前识别该类,确保序列化/反序列化时能匹配到正确的类加载路径。

3. 对等类加载配置验证

确认服务端的对等类加载是全局启用的,检查服务端的IgniteConfiguration:

IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setPeerClassLoadingEnabled(true);
// 其他配置...

若使用XML配置,需确保存在<property name="peerClassLoadingEnabled" value="true"/>。

4. 序列化名称映射冲突

启用setSimpleName(true)后,若服务端存在同名但不同包的Abc类,会导致类ID映射混乱,无法正确找到客户端传输的类。

  • 解决:
    • 暂时关闭setSimpleName(true),使用全类名映射验证问题;
    • 确保服务端不存在同名类干扰,或为Abc类指定唯一的二进制ID。

5. 任务定义方式问题

若计算任务是匿名内部类或非顶级类,Ignite可能无法完整扫描并传输其依赖类。

  • 解决:将计算任务定义为独立的顶级类,避免使用内部类/匿名类提交任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:04:59