Ignite从2.11.0升级至2.15.0后clear()方法抛出异常求助
Ignite 2.15.0中clear()方法抛出异常的原因排查与解决方案
异常现象
从Ignite 2.11.0升级到2.15.0后,未修改任何配置,调用clear()/clearAll()方法时抛出如下异常:
javax.cache.CacheException: class org.apache.ignite.IgniteCheckedException: Remote job threw exception. at org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1272) at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.cacheException(IgniteCacheProxyImpl.java:2084) at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.clearAll(IgniteCacheProxyImpl.java:1654) at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.clearAll(GatewayProtectedCacheProxy.java:1202) at geode.casper.ignite.CasperIgniteHelper.clearAllByKeys(CasperIgniteHelper.java:107) at geode.tme.cache.TMECache.internalClearCacheItems(TMECache.java:86) at geode.tme.cache.CacheManager.clearCacheItems(CacheManager.java:58) at geode.tme.flatfile.task.ClearCacheTask.execute(ClearCacheTask.java:39) at geode.services.scheduler.task.Task.executeTask(Task.java:435) at geode.services.scheduler.task.Task.execute(Task.java:369) at geode.services.scheduler.process.Process.executeTasksNow(Process.java:287) at geode.services.scheduler.process.Process.executeTasks(Process.java:210) at geode.services.scheduler.process.Process.executeTasks(Process.java:197) at geode.services.scheduler.SchedulerServiceImpl$2.run(SchedulerServiceImpl.java:243) at java.lang.Thread.run(Thread.java:750) Caused by: class org.apache.ignite.IgniteCheckedException: Remote job threw exception. at org.apache.ignite.internal.util.IgniteUtils.cast(IgniteUtils.java:7929) at org.apache.ignite.internal.util.future.GridFutureAdapter.resolve(GridFutureAdapter.java:261) at org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:173) at org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:142) at org.apache.ignite.internal.processors.cache.GridCacheAdapter.clear(GridCacheAdapter.java:1147) at org.apache.ignite.internal.processors.cache.GridCacheAdapter.clearAll(GridCacheAdapter.java:1118) at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.clearAll(IgniteCacheProxyImpl.java:1651) ... 12 more Caused by: class org.apache.ignite.IgniteException: Remote job threw exception. at org.apache.ignite.internal.processors.cache.GridCacheAdapter$ClearTask.result(GridCacheAdapter.java:7174) at org.apache.ignite.internal.processors.task.GridTaskWorker$4.apply(GridTaskWorker.java:1071) at org.apache.ignite.internal.processors.task.GridTaskWorker$4.apply(GridTaskWorker.java:1064) at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:7463) at org.apache.ignite.internal.processors.task.GridTaskWorker.result(GridTaskWorker.java:1064) at org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:868) at org.apache.ignite.internal.processors.task.GridTaskWorker.processDelayedResponses(GridTaskWorker.java:716) at org.apache.ignite.internal.processors.task.GridTaskWorker.body(GridTaskWorker.java:539) at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125) at org.apache.ignite.internal.processors.task.GridTaskProcessor.startTask(GridTaskProcessor.java:753) at org.apache.ignite.internal.processors.task.GridTaskProcessor.execute(GridTaskProcessor.java:448) at org.apache.ignite.internal.processors.cache.GridCacheAdapter.executeClearTask(GridCacheAdapter.java:1172) ... 15 more Caused by: class org.apache.ignite.spi.IgniteSpiException: Failed to send message to remote node: TcpDiscoveryNode [id=a064e16f-0b64-43a7-a687-abcbb7887e2f, consistentId=a064e16f-0b64-43a7-a687-abcbb7887e2f, addrs=ArrayList [127.0.0.1, 172.17.0.2], sockAddrs=null, discPort=0, order=5, intOrder=5, lastExchangeTime=1694434475703, loc=false, ver=2.15.0#20230425-sha1:f98f7f35, isClient=true] at org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.sendMessage0(TcpCommunicationSpi.java:1152) at org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.sendMessage(TcpCommunicationSpi.java:1052) at org.apache.ignite.internal.managers.communication.GridIoManager.send(GridIoManager.java:2102) at org.apache.ignite.internal.managers.communication.GridIoManager.sendToGridTopic(GridIoManager.java:2195) at org.apache.ignite.internal.processors.task.GridTaskWorker.sendRequest(GridTaskWorker.java:1450) at org.apache.ignite.internal.processors.task.GridTaskWorker.processMappedJobs(GridTaskWorker.java:669) at org.apache.ignite.internal.processors.task.GridTaskWorker.body(GridTaskWorker.java:533) ... 19 more Caused by: class org.apache.ignite.IgniteCheckedException: No session found at org.apache.ignite.spi.communication.tcp.internal.GridNioServerWrapper.createNioSession(GridNioServerWrapper.java:660) at org.apache.ignite.spi.communication.tcp.internal.GridNioServerWrapper.createTcpClient(GridNioServerWrapper.java:693) at org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.createTcpClient(TcpCommunicationSpi.java:1181) at org.apache.ignite.spi.communication.tcp.internal.GridNioServerWrapper.createTcpClient(GridNioServerWrapper.java:691) at org.apache.ignite.spi.communication.tcp.internal.ConnectionClientPool.createCommunicationClient(ConnectionClientPool.java:442) at org.apache.ignite.spi.communication.tcp.internal.ConnectionClientPool.reserveClient(ConnectionClientPool.java:231) at org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.sendMessage0(TcpCommunicationSpi.java:1105)
原因分析
从异常栈根因No session found以及目标节点标记isClient=true可以定位问题:
- TCP通信SPI逻辑变更:Ignite 2.11到2.15版本间,TCP通信SPI对客户端节点的连接会话处理逻辑调整,旧版本会自动重试或忽略向离线客户端发消息的失败,2.15版本则直接抛出会话不存在异常。
- 集群拓扑不一致:集群元数据仍保留已离线的客户端节点信息,
clearAll()操作广播到所有节点时,向该离线客户端发送清理任务导致连接失败。 - 清理任务默认覆盖客户端:默认情况下
clear()/clearAll()会在所有集群节点(包括客户端)执行,但客户端通常不存储缓存数据,向其发送清理任务属于无效操作,新版本中触发了异常。
解决方案
1. 限制清理任务仅在服务器节点执行
修改代码,仅针对服务器节点执行清理,避免向客户端发送任务:
// 获取仅包含服务器节点的集群视图 IgniteCluster serverCluster = ignite.cluster().forServers(); // 通过服务器集群视图执行清理 serverCluster.cache("your-cache-name").clearAll(keys);
2. 调整TCP通信SPI配置
优化连接参数,加快集群感知离线节点速度,增加重试机制:
TcpCommunicationSpi commSpi = new TcpCommunicationSpi(); // 设置连接超时时间 commSpi.setConnectionTimeout(5000); // 设置重连次数 commSpi.setReconnectCount(3); // 配置心跳检测,加速离线节点识别 commSpi.setIdleConnectionTimeout(60000); commSpi.setHeartbeatFrequency(10000); // 应用配置到Ignite实例 IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setCommunicationSpi(commSpi);
3. 清理离线客户端节点
- 排查客户端节点是否存在意外断开、网络波动等问题,修复客户端连接稳定性;
- 触发集群拓扑刷新,移除已离线的客户端节点信息。
4. 升级到更高版本
该问题属于2.15版本的已知连接管理问题,可升级到2.16.0及以上稳定版本,此类问题通常会在后续版本中修复。
5. 添加异常重试逻辑
在业务代码中捕获异常,增加重试机制应对临时网络波动:
int retryCount = 3; for (int i = 0; i < retryCount; i++) { try { ignite.cache("your-cache-name").clearAll(keys); break; } catch (CacheException e) { if (i == retryCount - 1) { throw e; // 最后一次重试失败,抛出异常 } Thread.sleep(1000); // 间隔1秒后重试 } }
内容的提问来源于stack exchange,提问作者Venkatesh H Naik
相关产品推荐
相关产品推荐

