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

直接上代码


    @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;
        }
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值