Ignite thick client向网格提交compute作业相关配置及问题咨询
Ignite厚客户端Compute作业提交问题解答
基础能力说明
Ignite厚客户端(Thick Client)原生支持向网格提交Compute作业,不存在类似瘦客户端maxActiveComputeTasksPerConnection的权限开关配置,默认就具备作业提交能力,无需额外开启权限类参数。
作业卡住的原因分析
你遇到的作业无返回的问题,和厚客户端权限无关,核心是以下两个原因:
- 对等类加载配置不完整:你仅开启了服务端的对等类加载,厚客户端节点也需要同步开启
peerClassLoadingEnabled配置,否则服务端无法从客户端拉取作业运行所需的类,会一直处于类加载等待状态,表现为作业挂起无返回。 - Lambda表达式的类传递限制:Java的Lambda表达式生成的匿名实现类,无法被Ignite的对等类加载机制正确识别和传递,即使两端都开了对等类加载,也经常出现类找不到的问题,这是Ignite的已知使用限制。
你将第二个节点改为服务端模式后作业立刻运行,是因为服务端节点属于forServers()匹配的集群组,作业会优先调度到同节点本地运行,不需要跨节点传递类,自然不会触发上述的类加载问题。
修复方案
你可以按以下步骤验证修复:
- 厚客户端配置显式开启对等类加载,示例代码如下:
IgniteConfiguration cfg = new IgniteConfiguration(); // 客户端也要开启对等类加载 cfg.setPeerClassLoadingEnabled(true); // 其余配置保持和服务端集群匹配
- 如果开启配置后仍有问题,将Lambda替换为显式实现
IgniteRunnable接口的静态类,不要使用Lambda或匿名内部类,示例如下:
// 单独定义作业实现类 public static class PrintTask implements IgniteRunnable { @Override public void run() { System.out.println("Task Executed"); } } // 作业提交逻辑 ClusterGroup grp = ignite.cluster().forServers(); IgniteCompute igniteCompute = ignite.compute(grp); igniteCompute.run(new PrintTask());
- 也可以直接把作业实现类提前放到所有服务端节点的类路径下,无需依赖对等类加载即可正常运行。
内容的提问来源于stack exchange,提问作者curious_soul
相关产品推荐
相关产品推荐

