前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 使用代码在运行时获取mysql、jdk、elasticsearch、redis、netty、kafka等组件的版本号

Java 使用代码在运行时获取mysql、jdk、elasticsearch、redis、netty、kafka等组件的版本号

作者头像
heasy3
发布2021-12-06 13:35:13
6750
发布2021-12-06 13:35:13
举报

直接上代码

代码语言:javascript
复制
    @FunctionalInterface
    interface VersionGetter {
        String getVersion();
    }

    @Slf4j
    private static class MysqlVersionGetter implements VersionGetter {
        @Override
        public String getVersion() {
            try {
                final DataSource dataSource = SpringUtil.getBean(DataSource.class);
                if (dataSource != null) {
                    final Connection connection = dataSource.getConnection();
                    return connection.getMetaData().getDatabaseProductVersion();
                }
            } catch (Exception e) {
                log.error("获取mysql版本出错", e);
            }
            return null;
        }
    }

    private static class JavaVersionGetter implements VersionGetter {
        @Override
        public String getVersion() {
            return SystemUtil.get(SystemUtil.VERSION);
        }
    }

    @Slf4j
    private static class EsVersionGetter implements VersionGetter {
        @Override
        public String getVersion() {
            try {
                final RestHighLevelClient bean = SpringUtil.getBean(RestHighLevelClient.class);
                final MainResponse info = bean.info(RequestOptions.DEFAULT);
                final MainResponse.Version version = info.getVersion();
                return version.getNumber();
            } catch (IOException e) {
                log.error("获取ES版本出错", e);
            }
            return null;
        }
    }

    @Slf4j
    private static class RedisVersionGetter implements VersionGetter {
        @Override
        public String getVersion() {

            //因我的redis服务 info命令重命名了 所以使用了lua脚本方式
            //如果没有重命名 直接调用template的info api即可
            try {
                final StringRedisTemplate redisTemplate = RedisUtil.getRedisTemplate();
                final String response = redisTemplate.execute(ServerInfoScript.getInstance(), new ArrayList<>());
                if (StrUtil.isNotBlank(response)) {
                    final String[] split = response.split("\r\n");
                    for (String item : split) {
                        if (StrUtil.startWith(item, "redis_version")) {
                            final String[] versionSplit = item.split(":");
                            if (versionSplit.length == 2) {
                                return versionSplit[1];
                            }
                        }
                    }
                }
            } catch (Exception e) {
                log.error("获取redis版本出错", e);
            }
            return null;
        }
    }

    private static class NettyVersionGetter implements VersionGetter {
        @Override
        public String getVersion() {
            final Map<String, Version> identify = Version.identify();
            //netty组件有很多版本 这里随便取了一个
            final Version version = identify.values().stream().findFirst().orElse(null);
            if (version != null) {
                return version.artifactVersion();
            }
            return null;
        }
    }


    private static class KafkaVersionGetter implements VersionGetter {
        @Override
        public String getVersion() {
            return AppInfoParser.getVersion();
        }
    }

    private static class HotfixVersionGetter implements VersionGetter {
        @Override
        public String getVersion() {
            File file = new File("/data/tip/hotfix/hotfix-version.txt");
            if (file.exists() && file.isFile()) {
                return FileUtil.readUtf8String(file);
            } else {
                return null;
            }
        }
    }

    private static class ServerInfoScript implements RedisScript<String> {

        private static final ServerInfoScript INSTANCE = new ServerInfoScript();

        private ServerInfoScript() {
        }

        public static ServerInfoScript getInstance() {
            return INSTANCE;
        }

        private final String cmd = "return redis.call('redisinfo','server')";

        @Override
        public String getSha1() {
            return SecureUtil.sha1(cmd);
        }

        @Override
        public Class<String> getResultType() {
            return String.class;
        }

        @Override
        public String getScriptAsString() {
            return cmd;
        }
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档