在网站做推广属于广告费吗,网站建设应该考虑哪些方面,可以发外链的网站整理,网络营销的职业当一台机器下线时#xff0c;面临很多问题#xff1a;如何将其从注册中心下线#xff1f;如何清理释放资源#xff1f;客户端拉取服务列表时也使用了本地缓存#xff0c;如何及时更新本地缓存#xff1f; 服务端机器的优雅下线需要使用ShutdownHook#xff0c;这相当于添… 当一台机器下线时面临很多问题如何将其从注册中心下线如何清理释放资源客户端拉取服务列表时也使用了本地缓存如何及时更新本地缓存 服务端机器的优雅下线需要使用ShutdownHook这相当于添加了一个关闭钩子这个钩子是一个线程它在JVM关闭时即程序结束时被调用清理资源优雅下机。 public void clearAll() {log.info(addShutdownHook for clearAll);// 添加了一个关闭钩子这个钩子是一个线程它在JVM关闭时即程序结束时被调用清理资源优雅下机Runtime.getRuntime().addShutdownHook(new Thread(() - {try {InetSocketAddress inetSocketAddress new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), NettyRpcServer.PORT);CuratorUtils.clearRegistry(CuratorUtils.getZkClient(), inetSocketAddress);} catch (UnknownHostException ignored) {}// 操作完整、优雅便于释放连接资源便于自定义清理逻辑ThreadPoolFactoryUtil.shutDownAllThreadPool();}));}在钩子线程中需要编写从注册中心当中删除节点的逻辑如下所示 // RPC Server端 本机所注册服务的缓存private static final SetString REGISTERED_PATH_SET ConcurrentHashMap.newKeySet();public static void clearRegistry(CuratorFramework zkClient, InetSocketAddress inetSocketAddress) {REGISTERED_PATH_SET.stream().parallel().forEach(p - {try {// 是本机在ZK注册的节点if (p.endsWith(inetSocketAddress.toString())) {// 根据路径名删除节点zkClient.delete().forPath(p);}} catch (Exception e) {log.error(clear registry for path [{}] fail, p);}});log.info(All registered services on the server are cleared:[{}], REGISTERED_PATH_SET.toString());} 在注册中心ZK当中删除节点之后需要释放线程池资源 public static void shutDownAllThreadPool() {log.info(call shutDownAllThreadPool method);THREAD_POOLS.entrySet().parallelStream().forEach(entry - {ExecutorService executorService entry.getValue();// 停止接收新的任务但已提交的任务会继续执行executorService.shutdown();log.info(shut down thread pool [{}] [{}], entry.getKey(), executorService.isTerminated());try {// 等待线程池中的任务在指定的时间内完成。如果在指定时间内线程池未能终止会抛出 InterruptedExceptionexecutorService.awaitTermination(10, TimeUnit.SECONDS);} catch (InterruptedException e) {log.error(Thread pool never terminated);// 指定时间内线程池未能终止立即停止所有正在执行的任务executorService.shutdownNow();}});} 自定义关闭线程池的逻辑可以更加优雅的实现线程池资源的释放。可以达到停止接受新的任务继续在一定等待时间范围内执行已提交的任务超出等待时间在强制终止线程池。