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类:
让Ignite提前识别该类,确保序列化/反序列化时能匹配到正确的类加载路径。import java.util.Collections; // ... binCfg.setClasses(Collections.singletonList(com.ignite.proxy.spring.jpa.pojo.Abc.class));
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
相关产品推荐
相关产品推荐

