Apache Ignite 2.8.0 Java瘦客户端执行后自动终止问题求助
解决Apache Ignite 2.8.0瘦客户端执行后自动终止的问题
你的问题根源主要有两个:一是try-with-resources语法会自动关闭IgniteClient实例,代码块执行完毕后客户端就被销毁了;二是服务端可能因为客户端空闲触发了连接超时,主动关闭了连接,导致你看到那个IO异常。下面是具体的解决方法:
1. 避免自动关闭客户端(或在代码块内保持程序运行)
你当前用的try (IgniteClient igniteClient = Ignition.startClient(cfg))是try-with-resources结构,它会在try代码块执行完成后自动调用close()方法关闭客户端。如果要保持客户端存活,你可以:
方法A:手动管理客户端生命周期
去掉try-with-resources,手动控制客户端的关闭时机:
public static void main(String[] args) throws IgniteClientException { ClientConfiguration cfg = new ClientConfiguration().setAddresses("127.0.0.1:10800"); IgniteClient igniteClient = Ignition.startClient(cfg); try { System.out.println("Thin client started."); final String CACHE_NAME = "sample"; ClientCache<Integer, Object> cache = igniteClient.getOrCreateCache(CACHE_NAME); cache.put(1,"JP"); System.out.println(cache.get(1)); // 保持程序运行,比如等待用户输入或者阻塞线程 System.out.println("Press Enter to exit..."); new Scanner(System.in).nextLine(); } finally { // 在需要关闭的时候手动关闭客户端 igniteClient.close(); } }
方法B:在try-with-resources内添加阻塞逻辑
如果你想保留try-with-resources的自动关闭特性,只需要在代码块内加入阻塞逻辑,不让代码块提前结束:
ClientConfiguration cfg = new ClientConfiguration().setAddresses("127.0.0.1:10800"); try (IgniteClient igniteClient = Ignition.startClient(cfg)) { System.out.println("Thin client started."); final String CACHE_NAME = "sample"; ClientCache<Integer, Object> cache = igniteClient.getOrCreateCache(CACHE_NAME); cache.put(1,"JP"); System.out.println(cache.get(1)); // 阻塞线程,防止try代码块结束 Thread.currentThread().join(); } catch (Exception e) { e.printStackTrace(); }
2. 配置客户端心跳,防止服务端主动断开连接
你的报错显示连接被远程主机强制关闭,这可能是因为Ignite服务端默认会对空闲连接进行超时清理。你可以在客户端配置中开启并调整心跳参数,保持连接活跃:
ClientConfiguration cfg = new ClientConfiguration() .setAddresses("127.0.0.1:10800") .setConnectionTimeout(30000) // 连接超时时间 .setHeartbeatInterval(5000) // 心跳发送间隔 .setHeartbeatTimeout(10000); // 心跳超时时间 try (IgniteClient igniteClient = Ignition.startClient(cfg)) { // 业务代码... // 阻塞保持存活 System.out.println("Client is running. Press Ctrl+C to stop."); Thread.currentThread().join(); }
这些参数的作用:
setHeartbeatInterval:客户端每隔多久向服务端发送一次心跳包setHeartbeatTimeout:客户端等待服务端心跳响应的超时时间setConnectionTimeout:客户端建立连接的超时时间
关于报错的补充说明
你看到的java.io.IOException: An existing connection was forcibly closed by the remote host,本质是因为客户端执行完代码后被自动关闭,服务端检测到连接关闭后主动断开了底层socket连接,这个异常更多是连接关闭时的连带现象,解决客户端存活的问题后这个报错也会消失。
内容的提问来源于stack exchange,提问作者JAYAPRAKASH
相关产品推荐
相关产品推荐

